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



您好,我正在尝试使用英特尔mpiifort来编译我的程序。制作过程中发生一个错误:

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. 

我在单个主机上阅读了多个 glibc 库,并且我同时遵守了 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.

使用iforticc时出现相同的错误

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

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

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

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

最新更新