如何确定需要什么样的OS依赖包一个Haskell可执行文件?

问题描述 投票:4回答:1

我刚刚编译stack build的可执行文件,然后只复制过的可执行文件到不同的机器,但运行的应用程序的结果:

./app: error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No such file or directory

我猜我需要从相应的Linux发行版的软件包安装一些软件包 - 但有没有更有效的方法,然后google搜索,来了,并试图找出包中的每个错误?

我已经尝试了一些搬运工图像内运行可执行程序:fpco/haskell-scratchdebian:stretch-slim其中同一行为的所有结果:

sudo docker run --rm -it -v $(pwd):/abcxyz fpco/haskell-scratch sh
# /abcxyz/app
/abcxyz/app: error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No such file or directory

更新

使用Debian像我安装了OpenSSL:

apt-get install openssl

新的错误:

/ abcxyz /应用程式:错误而载入共享库:libgmp.so.10:无法打开共享对象文件:没有这样的文件或目录

apt-get install libgmp-dev

和它的作品...

haskell haskell-stack
1个回答
6
投票

其实,这是不特定于哈斯克尔,而是Linux的动态链接共享库的方式。您可以使用ldd <file>

% ldd ./StateSort
    linux-vdso.so.1 (0x00007ffd29385000)
    libm.so.6 => /usr/lib/libm.so.6 (0x00007fd986bd1000)
    libgmp.so.10 => /usr/lib/libgmp.so.10 (0x00007fd98693e000)
    librt.so.1 => /usr/lib/librt.so.1 (0x00007fd986736000)
    libdl.so.2 => /usr/lib/libdl.so.2 (0x00007fd986532000)
    libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fd986314000)
    libc.so.6 => /usr/lib/libc.so.6 (0x00007fd985f5c000)
    /lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007fd986f1d000)

如果缺少库,你会发现他们的时候了:右侧与路径so文件将不存在。

然后,您将要参考你的Linux发行版的包管理系统,找出包可能包含所需so文件。对于Ubuntu的,你会用apt-file,为ArchLinux的 - pkgfile,等等。

我必须警告你,ldd实际执行一些在文件中找到的代码,因此恶意程序可以接管并肆虐。如果你想仔细来历不明的可执行这种方式,你必须在一次性法医遏制这样做。据我所知,这并不适用于手头的案件,但尽管如此我必须警告你。

© www.soinside.com 2019 - 2024. All rights reserved.