![ldd 告诉我我的应用程序“不是动态可执行文件”](https://linux22.com/image/31741/ldd%20%E5%91%8A%E8%AF%89%E6%88%91%E6%88%91%E7%9A%84%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E2%80%9C%E4%B8%8D%E6%98%AF%E5%8A%A8%E6%80%81%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6%E2%80%9D.png)
我有一个从天文学教授那里收到的 32 位应用程序(称为 uclsyn)。一年前我设法让它在 CentOS 上运行,但现在当我设置一个新的 CentOS 虚拟机时,它无法运行,我也不知道为什么。它不断地以“被杀”回来。
这是命令行上的交换:
$ ./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
在运行的机器上,“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 2 月 21 日星期四 12:50:49 UTC 2013 i686 i686 i386 GNU/Linux
答案1
我刚刚遇到了 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
答案2
这里的错误是由于虚拟机上没有足够的 RAM 造成的。运行strace ./programname
表明该程序在加载任何库之前刚开始运行就被终止。增加可用 RAM 量可确保程序能够运行。
有用的回应
其他人提供了一些有用的回复,即 @slm 提供了有用的命令来检查每个库是否存在,@lgeorget 建议尝试该strace
命令。
答案3
您可以发布一些它链接到的库(来自原始系统)吗?您可能只需要安装一些缺少的库。
通常在 CentOS 系统上,只需运行 yum 命令,如下所示:
yum install <package name>
您可以从原始系统向后工作,如下所示:
$ 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)
在该输出中,您可以看到我的副本在哪里/bin/ls
获取共享 .so 库,例如,librt.so.1
它恰好位于此处:/lib64/librt.so.1
。
知道了这一点,在原始系统上,您可以运行以下命令来找出哪个包提供了该库:
$ rpm -qf /lib64/librt.so.1
glibc-2.13-2.x86_64
所以该包被称为glibc-2.13-2.x86_64
.所以要安装它,你需要这样做:
$ sudo yum install glibc-2.13-2.x86_64
答案4
尝试readelf -l uclsyn_linux
请求程序解释器会告诉你你错过了什么。