我正在编译一些代码,出于各种原因,我正在静态地执行它。在我的 Ubuntu 12.04 / gcc 4.6.3 机器上,它编译执行得很好,并且是完全静态的:
> ldd mycode
not a dynamic executable
到目前为止,一切都很好。但我还需要在另一台机器上运行它,一个 Scientific Linux 5 系统,运行 gcc 4.5.3。出于某种原因,ldd 还剩下一些动态库:
> ldd mycode
linux-vdso.so.1 => (0x00007fffd75fd000)
libstdc++.so.6 => /usr/local/swift/gcc-4.5.3/lib64/libstdc++.so.6 (0x00002b4bafab2000)
libm.so.6 => /lib64/libm.so.6 (0x000000398ca00000)
libc.so.6 => /lib64/libc.so.6 (0x000000398c600000)
/lib/ld64.so.1 => /lib64/ld-linux-x86-64.so.2 (0x000000398c200000)
libgcc_s.so.1 => /usr/local/swift/gcc-4.5.3/lib64/libgcc_s.so.1 (0x00002b4bafdb8000)
这本身就很好。代码编译链接OK,从ldd可以看出,所有的依赖都解决了。但是,当我尝试在 SL 机器上执行它时,它失败了:
> ./mycode
/lib/ld64.so.1: bad ELF interpreter: No such file or directory
据我所知,在执行时由于某种原因/lib/ld64.so.1 => /lib64/ld-linux-x86-64.so.2
链接没有被解析,即使 ldd 做到了。当然,在我有 root 访问权限的机器上,我可以通过从 ld-linux-x84..blah 到 /lib/ld64.so.1 的符号链接来解决这个问题,但这是一个相当裤子的解决方案,我不能申请它到我们的集群。如果我动态编译整个东西,它工作正常,但这意味着在一堆我想避免的机器上安装我正在编译的所有第 3 方库。最后,我编译的所有依赖项也被另一个项目使用,也用cmake编译,在那种情况下我没有问题,ldd实际上直接列出了/lib64/ld-linux ...blah,而不是调用到 /lib/ld64.so。
那么 - 为什么会发生这种情况?为什么我可以编译和链接代码 OK,ldd it OK,但不能执行它?任何想法将不胜感激!