使用 patchelf 添加对动态库的声明依赖无效

Ineffective to use patchelf to add a declared dependency on a dynamic library

你好我正在尝试使用英特尔 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

解决了

这个错误:

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

same errors when using ifort and icc

看起来 iforticc 都在使用 linker 插件来执行 LTO (link-time优化)。

您需要 patchelf 实际失败的二进制文件(在本例中为 ld), 而不是 仅调用 ld 的二进制文件(即单独留下 iforticc)。

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

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