使用patchelf修改icx-lto.so依赖后Intel MPI编译仍报GLIBC_2.14缺失如何解决
问题根因
你针对icx-lto.so修改的rpath和动态库依赖规则仅对该库本身作为可执行程序直接运行时生效,而实际场景下icx-lto.so是链接器ld加载的插件:运行在系统原生低版本glibc环境下的ld会优先使用自身已经加载的glibc符号,忽略插件自身指定的rpath路径下的高版本glibc,因此修改icx-lto.so无法解决报错。
可行解决方案
- 方案1:参照
ifort的修复逻辑修改mpiifort二进制
找到你的mpiifort可执行文件实际路径,执行以下命令即可:
操作后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/ 你的mpiifort实际路径mpiifort调用的所有工具链都会加载你指定的高版本glibc,不会再触发系统低版本glibc的符号检查。 - 方案2:临时指定glibc加载路径执行编译
不想修改二进制的话,可以在执行make前强制让整个编译进程使用你编译的高版本glibc:xxx/glibc/glibc-2.17-gcc-4.8.5/lib/ld-linux-x86-64.so.2 --library-path xxx/glibc/glibc-2.17-gcc-4.8.5/lib:$LD_LIBRARY_PATH $(which make) - 方案3:禁用LTO跳过插件加载
编译时添加-fno-lto参数,禁用ICX的LTO优化,链接阶段就不会加载icx-lto.so,自然不会触发该报错。
注意事项
操作前确认你使用的glibc路径统一,不要混用xxx/glibc-2.17/lib和xxx/glibc/glibc-2.17-gcc-4.8.5/lib两个不同编译版本的glibc路径,避免出现其他符号冲突。
内容的提问来源于stack exchange,提问作者yi yuan
相关产品推荐
相关产品推荐

