linux动态库加载路径

Creative Commons
本作品采用知识共享署名

本文说明Linux动态库搜索路径和顺序.

搜索路径

Linux动态库搜索路径五种:

1. 编译代码时指定

编译时用“-Wl,-rpath,”指定动态库搜索路径,例如

1
gcc -o test.elf main.c -Wl,-rpath,/opt/lib,-rpath,/opt/test/lib

2. 环境变量LD_LIBRARY_PATH

运行时使用环境便利指定动态库搜索路径,例如

1
export LD_LIBRARY_PATH = $(LD_LIBRARY_PATH):/opt/lib:/opt/test/lib

3. /etc/ld.so.conf

在/etc/ld.so.conf中添加要搜索的路径即可

4. 默认搜索/lib

5. 默认搜索/usr/lib

搜索顺序

动态库路径搜索顺序如下,使用最新搜索到的库
编译代码时指定->LD_LIBRARY_PATH->ld.so.conf->/lib->/user/lib

符号替换

另外Linux还提供了一种机制可以替换掉动态库中的符号,可以看做是优先级更高的动态库

1. LD_PRELOAD

运行时优先使用LD_PRELOAD指定的动态库的付款,例如mymalloc.so中有malloc,当设置

1
export LD_PRELOAD= "$LD_PRELOAD /opt/lib/mymalloc.so"

后,运行程序就会执行到mymalloc.so中的malloc

2. /etc/ld.so.preload

在/etc/ld.so.preload中添加要替换的so路径即可,顺序上LD_PRELOAD>/etc/ld.so.preload

注意

在对要执行的应用程序做setcap和改变uid/gid后,由于安全的原因LD_PRELOAD和LD_LIBRARY_PATH将对该应用失效,为了达到相同的效果可以在ld.so.preload和ld.so.conf添加对应的搜索路径即可。就是在遇到这样的情况下才让我产生记录搜索动态库的想法。