如何确定 Haskell 可执行文件需要哪些 OS 依赖包?
How do I determine what OS dependency packages are required for a Haskell executable?
我刚刚用 stack build
编译了一个可执行文件,然后将可执行文件复制到另一台机器上,但是 运行 应用程序导致:
./app: error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No such file or directory
我猜我需要从适当的 Linux 发行版的软件包中安装一些软件包 - 但是有没有比谷歌搜索出现的每个错误并尝试识别软件包更有效的方法?
我已经在一些 docker 图像中尝试 运行 可执行文件:
fpco/haskell-scratch
、debian: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/app:加载共享库时出错:libgmp.so.10:无法打开共享对象文件:没有这样的文件或目录
apt-get install libgmp-dev
而且有效...
这实际上并不特定于 Haskell,而是特定于 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
实际上执行的是文件中的某些代码,因此恶意程序可能会接管并造成严重破坏。如果您想以这种方式剖析来源不明的可执行文件,则必须在一次性取证容器中进行。据我了解,这不适用于当前的情况,但我必须警告您。
我刚刚用 stack build
编译了一个可执行文件,然后将可执行文件复制到另一台机器上,但是 运行 应用程序导致:
./app: error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No such file or directory
我猜我需要从适当的 Linux 发行版的软件包中安装一些软件包 - 但是有没有比谷歌搜索出现的每个错误并尝试识别软件包更有效的方法?
我已经在一些 docker 图像中尝试 运行 可执行文件:
fpco/haskell-scratch
、debian: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/app:加载共享库时出错:libgmp.so.10:无法打开共享对象文件:没有这样的文件或目录
apt-get install libgmp-dev
而且有效...
这实际上并不特定于 Haskell,而是特定于 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
实际上执行的是文件中的某些代码,因此恶意程序可能会接管并造成严重破坏。如果您想以这种方式剖析来源不明的可执行文件,则必须在一次性取证容器中进行。据我了解,这不适用于当前的情况,但我必须警告您。