【问题标题】:Ineffective to use patchelf to add a declared dependency on a dynamic library使用 patchelf 添加声明的对动态库的依赖无效
【发布时间】:2021-09-28 08:32:26
【问题描述】:

您好,我正在尝试使用 intel mpiifort 来编译我的程序。 make 过程中出现一个错误:

ld:xxx/intel/oneapi/compiler/2021.2.0/linux/bin/intel64/../../bin/intel64/../../lib/icx-lto.so: error loading plugin: /lib64/libc.so.6: version `GLIBC_2.14' not found. 

我阅读了这个Multiple glibc libraries on a single host 并且我同时遵守了 glibc-2.17 和 patchelf。然后我输入

patchelf --set-rpath xxx/glibc-2.17/lib/ xxx/intel/oneapi/compiler/2021.2.0/linux/lib/icx-lto.sopatchelf --add-needed xxx/glibc-2.17/lib/libc.so.6 xxx/intel/oneapi/compiler/2021.2.0/linux/lib/icx-lto.so

ldd xxx/intel/oneapi/compiler/2021.2.0/linux/lib/icx-lto.so 的结果是

linux-vdso.so.1 => (0x00007fffaa5ff000)

   libc.so.6 => xxx/glibc/glibc-2.17/lib/libc.so.6 (0x00007fb1adff8000)
   librt.so.1 => xxx/glibc/glibc-2.1/lib/librt.so.1 (0x00007fb1addf0000)
   libdl.so.2 => xxx/glibc/glibc-2.17/lib/libdl.so.2 (0x00007fb1adbec000)
   libimf.so => xxx/intel/oneapi/compiler/2021.2.0/linux/compiler/lib/intel64_lin/libimf.so (0x00007fb1ad563000)
   libm.so.6 => xxx/glibc/glibc-2.17/lib/libm.so.6 (0x00007fb1ad265000)
   libz.so.1 => /lib64/libz.so.1 (0x00007fb1ad032000)
   libsvml.so => xxx/intel/oneapi/compiler/2021.2.0/linux/compiler/lib/intel64_lin/libsvml.so (0x00007fb1ab534000)
   libirng.so => xxx/intel/oneapi/compiler/2021.2.0/linux/compiler/lib/intel64_lin/libirng.so (0x00007fb1ab1ca000)
   libgcc_s.so.1 => xxx/gcc-4.7.4/lib64/libgcc_s.so.1 (0x00007fb1aafb4000)
   libintlc.so.5 => xxx/intel/oneapi/compiler/2021.2.0/linux/compiler/lib/intel64_lin/libintlc.so.5 (0x00007fb1aad3b000)
   libpthread.so.0 => xxx/glibc-2.17/lib/libpthread.so.0 (0x00007fb1aab1e000)
   /lib64/ld-linux-x86-64.so.2 (0x0000003b70a00000)

但是当我重新编译我的程序时它仍然无法正常工作。有人有解决办法吗?

使用iforticc 时实际上出现相同的错误。但是被patchelf --set-interpreter xxx/glibc/glibc-2.17-gcc-4.8.5/lib/ld-linux-x86-64.so.2 --set-rpath xxx/glibc/glibc-2.17-gcc-4.8.5/lib/ xxx/intel/oneapi/compiler/2021.2.0/linux/bin/intel64/ifort解决了

【问题讨论】:

  • 您的修补程序icx-lto.so 是否仍能找到/lib64/libz.so.1?我猜你的xxx/glibc/glibc-2.17/lib/ 中没有libz.so.1。我想这可能没问题,只要 libz 不尝试解决它自己对 /lib64/libc.so.1 的依赖关系。另外,glib 2.14 不是很老吗?也许是时候升级到更新版本的发行版了;当前的 glibc 是 2.33。
  • 您永远不应该在具有多个 GLIBC 的机器上使用 lddstackoverflow.com/a/68251162/50617。此外,在.so 上运行ldd 并不能告诉我们您的实际 问题是什么(“不工作”是什么意思?)。
  • @PeterCordes 是的,我想是的。而且我使用的是 CentOS 6.10 的集群,所以我必须适应它。
  • @EmployedRussian 不幸的是,env LD_TRACE_LOADED_OBJECTS=1 xxx/intel/oneapi/compiler/2021.2.0/linux/lib/icx-lto.so 的结果是Segmentation fault (core dumped),所以patchelf 损坏了这个.so?附言“不工作”意味着问题仍然存在。
  • 你没有继续使用每年都越来越过时的旧 CentOS 安装。即使是维护/安全更新,它也已经过了 EOL,并且自去年 11 月 (wiki.centos.org/About/Product) 以来就已经过了,所以现在是真的开始考虑退役集群或升级到新版本的时候了东西或新发行版。如果您想花更多时间在旧发行版上使用新编译器,这取决于您,但即使是 CentOS 8 也是 2015 年。

标签: linux x86-64 elf glibc


【解决方案1】:

这个错误:

ld: xxx/intel/oneapi/compiler/2021.2.0/linux/bin/intel64/.../icx-lto.so: error loading plugin: /lib64/libc.so.6: version `GLIBC_2.14' not found. 

似乎来自ld

使用iforticc 时出现相同的错误

看起来iforticc 都在使用linker 插件来执行LTO(链接时优化)。

您需要patchelf 实际失败的二进制文件(在这种情况下为ld),不是仅调用ld 的二进制文件(即留下iforticc )。

通常您可以告诉编译器打印有关它调用的二进制文件的更多信息,例如icc -v <rest of command>.

我希望.../intel/oneapi/compiler/2021.2.0/linux/... 下有ld(或者可能是ld.lld),而您需要patchelf 那个二进制。

【讨论】:

  • 是的,你是对的。问题是由ld 而不是icx-lto.so 引起的。而ld 实际上是一个来自 binutils 的应用程序。感谢您的帮助!
  • @yiyuan -- 如果答案对你有帮助,请点赞。如果它完全回答了您的问题,请接受它。
猜你喜欢
  • 1970-01-01
  • 2018-12-20
  • 2018-08-12
  • 1970-01-01
  • 2010-12-17
  • 2017-06-05
  • 1970-01-01
  • 2019-08-15
  • 1970-01-01
相关资源
最近更新 更多