使用 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.so
和
patchelf --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)
但是当我重新编译我的程序时它仍然没有工作。有人有解决办法吗?
实际上使用 ifort
和 icc
时出现相同的错误。但是通过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
看起来 ifort
和 icc
都在使用 linker 插件来执行 LTO (link-time优化)。
您需要 patchelf
实际失败的二进制文件(在本例中为 ld
), 而不是 仅调用 ld
的二进制文件(即单独留下 ifort
和 icc
)。
通常你可以告诉编译器打印更多关于它调用的二进制文件的信息,例如icc -v <rest of command>
.
我希望.../intel/oneapi/compiler/2021.2.0/linux/...
下有ld
(或者可能是ld.lld
),你需要patchelf
那二进制文件。
你好我正在尝试使用英特尔 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.so
和
patchelf --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)
但是当我重新编译我的程序时它仍然没有工作。有人有解决办法吗?
实际上使用 ifort
和 icc
时出现相同的错误。但是通过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
andicc
看起来 ifort
和 icc
都在使用 linker 插件来执行 LTO (link-time优化)。
您需要 patchelf
实际失败的二进制文件(在本例中为 ld
), 而不是 仅调用 ld
的二进制文件(即单独留下 ifort
和 icc
)。
通常你可以告诉编译器打印更多关于它调用的二进制文件的信息,例如icc -v <rest of command>
.
我希望.../intel/oneapi/compiler/2021.2.0/linux/...
下有ld
(或者可能是ld.lld
),你需要patchelf
那二进制文件。