【问题标题】:ld64.so present in ldd, missing at runtimeld64.so 存在于 ldd 中,在运行时丢失
【发布时间】:2014-05-12 08:39:44
【问题描述】:

我正在编译一些代码,出于各种原因,我正在静态地编译它。在我的 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,但不能执行它?任何想法都将不胜感激!

【问题讨论】:

  • 当您在一个比您尝试执行它的系统明显新的系统上编译某些东西时,可能会发生各种奇怪的不兼容问题。
  • 尝试在链接选项中添加-Wl,--dynamic-linker=/lib64/ld-linux-x86-64.so.2
  • 谢谢。我实际上并没有在比我执行它的新系统上编译它。我意识到我没有这么说——哎呀!对于具有较旧 gcc 的 SL 系统,我在该系统上从头开始完全重新编译代码 - 它在该机器上编译和链接良好,但随后给了我上述链接器输出和执行错误。我会尝试上面的行,虽然我认为 cmake 的部分意义正是如此,所以我不必担心那种事情!

标签: c++ linux gcc ldd


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我在 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
    

    问题解决了。

    【讨论】:

      猜你喜欢
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-14
      • 1970-01-01
      相关资源
      最近更新 更多