ld64.so存在于ldd中,在运行时丢失

时间:2014-05-12 08:39:45

标签: c++ linux gcc ldd

我正在编译一些代码,由于各种原因,我正在静态地进行编写。在我的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)

这本身就很好。代码编译并链接正常,正如您从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建立一个sym链接来解决这个问题,但这是一个相当简单的解决方案,我不能申请它到我们的集群。如果我动态编译整个东西它工作正常,但这意味着安装我正在编译的所有第三方库,我想避免一堆机器。最后,我编译的所有依赖项也被另一个项目使用,也用cmake编译,在这种情况下我没有问题,ldd实际上直接列出了/lib64/ld-linux...blah,而不是一个调用到/lib/ld64.so。

所以 - 为什么会这样?为什么我可以编译和链接代码OK,ldd它没关系,但是没有执行它?任何想法都会感激不尽!

2 个答案:

答案 0 :(得分:4)

好吧,我想我最终解决了这个问题。它基本上是由cmake传递的链接器参数,它是静态和动态组合的讨厌组合。但是,将以下行添加到我的CMakeLists.txt中修复它:

SET_TARGET_PROPERTIES (mytarget PROPERTIES LINK_SEARCH_START_STATIC 1)
SET_TARGET_PROPERTIES (mytarget PROPERTIES LINK_SEARCH_END_STATIC 1)

答案 1 :(得分:0)

我在 cenos7 系统上遇到了同样的问题。 并且操作系统同时安装了 ld-linux i386 和 x86_64。 您可以看到 /lib 下的 ld-linux 是 objdump -a /lib/ld-linux.so 的 i386 版本 而我:

rm /lib/ld-*.so
ln -s ld64.so.1 /lib64/ld-linux.so

问题解决了。