链接库搜索问题

查看某个 bin/so 依赖的链接库

ldd $bin
ldd -v $bin 

动态连接库加载顺序

LD_PRELOAD > RPATH > LD_LIBRARY_PATH

使用 LD_PRELOAD

LD_PRELOAD=/opt/libstdcxx/lib64/libstdc++.so.6 $bin # 预加载 libstdc++.so.6

Note libc.so.6 预加载问题
无法预加载 libc.so.6 需要通过ld-linux-x86-64.so.2 来加载对应的 libc.so,其中 /opt/glibc-2.18/lib/ 是对应动态链接库路径,里面需要有 libc.so.6,libdl.so

/opt/glibc-2.18/lib/ld-linux-x86-64.so.2 --library-path /opt/glibc-2.18/lib/ $bin 

使用 RPATH

RPATH 可以通过环境变量或者是写入到binary中

# 环境变量
LD_RUN_PATH=XXX/lib

使用 patchelf 修改 rpatch

强制链接到其他的 glibc

gcc -Xlinker -rpath=/default/path/to/libraries -Xlinker -I/default/path/to/libraries/ld.so program.c

使用 LD_LIBRARY_PATH

export LD_LIBRARY_PATH=XXX

参考

https://stackoverflow.com/questions/55186770/can-ld-preload-be-used-to-load-different-versions-of-glibc

原文地址:https://www.cnblogs.com/stdpain/p/14738714.html