ldd 告诉我我的应用程序“不是动态可执行文件”

Car*_*arl 26 libraries centos

我从一位天文学教授那里收到了一个 32 位应用程序(称为 uclsyn)。一年前我设法让它在 CentOS 上运行,但现在当我设置一个新的 CentOS 虚拟机时,它无法运行,我不知道为什么。它一直带着“Killed”回来。

这是命令行上的交换:

$ ./uclsyn_linux
Killed

$ ldd ./uclsyn_linux
not a dynamic executable

$ file ./uclsyn_linux
uclsyn_linux: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
Run Code Online (Sandbox Code Playgroud)

在运行的机器上,“ldd ./uclsyn_linux”返回一个完整的依赖列表。我找到了提供这些共享库的软件包,而且它们似乎都已安装。

需要的包裹

  • libSM-1.1.0-7.1.el6.i686
  • libX11-1.3-2.el6.i686
  • libgcc-4.4.6-3.el6.i386
  • glibc-2.12-1.47.el6_2.9.i686
  • libuuid-2.17.2-12.4.el6.i686
  • libXau-1.0.5-1.el6.i686
  • 我已经检查并已经安装了应用程序本地的一堆库。

我的环境

在 VirtualBox 下运行的 CentOS

uname -a: Linux localhost.localdomain 2.6.32-358.el6.i686 #1 SMP Thu Feb 21 12:50:49 UTC 2013 i686 i686 i386 GNU/Linux

kun*_*man 20

我刚刚遇到了 32 位二进制文​​件的问题,解决方案是:

apt-get install gcc-multilib

$ uname -a
Linux bla 2.6.32-028stab094.3 #1 SMP Thu Sep 22 12:47:37 MSD 2011 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

  • 你怎么发现那个lib丢失了? (3认同)
  • @yehudahs 我已经在 Linux 上运行了大量预编译的 32 位应用程序一段时间了,并对它们进行了逆向工程,所以我收集了一些故障排除经验。:D (2认同)

Car*_*arl 9

此处的错误是由于 VirtualMachine 上没有足够的 RAM。运行strace ./programname表明程序在开始运行时被终止,然后加载任何库。增加可用的 RAM 量可确保程序可以运行。

有用的回应

其他人提供了一些有用的回复,即@slm 提供了有用的命令来检查每个库是否存在,@lgeorget 建议尝试该strace命令。


slm*_*slm 5

你能发布一些它确实链接到的库(来自原始系统)吗?您可能只需要安装一些缺少的库。

通常在 CentOS 系统上,只需像这样运行 yum 命令:

yum install <package name>
Run Code Online (Sandbox Code Playgroud)

您可以像这样从原始系统向后工作:

$ ldd /bin/ls
    linux-vdso.so.1 =>  (0x00007fff519ff000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x00000034e8e00000)
    librt.so.1 => /lib64/librt.so.1 (0x00000034e8a00000)
    libcap.so.2 => /lib64/libcap.so.2 (0x0000003d6fe00000)
    libacl.so.1 => /lib64/libacl.so.1 (0x00000034fae00000)
    libc.so.6 => /lib64/libc.so.6 (0x00000034e7200000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00000034e7a00000)
    /lib64/ld-linux-x86-64.so.2 (0x00000034e6e00000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00000034e7e00000)
    libattr.so.1 => /lib64/libattr.so.1 (0x00000034f7600000)
Run Code Online (Sandbox Code Playgroud)

在该输出中,您可以看到我的副本在哪里/bin/ls获取共享 .so 库,例如,librt.so.1,它恰好位于此处:/lib64/librt.so.1。

知道了这一点,在原来的系统上,你可以运行这个命令来找出是什么包提供了这个库:

$ rpm -qf /lib64/librt.so.1
glibc-2.13-2.x86_64
Run Code Online (Sandbox Code Playgroud)

所以这个包被称为glibc-2.13-2.x86_64. 所以要安装它,你会这样做:

$ sudo yum install glibc-2.13-2.x86_64
Run Code Online (Sandbox Code Playgroud)