欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

动态库路径小结

程序员文章站 2022-06-03 13:54:28
...

动态库路径小结

1、概念:

​ 众所周知,程序通过/lib/ld.so寻找与加载动态库,且程序会在两种情况下加载动态库: 编译链接运行,而动态库的寻找可以有以下多种配置方法。

2、两种情况下路径配置

1、编译链接时:

​ ①gcc 的 -L 参数 :

gcc tt.cpp -o tt.out -I:./include -L./lib -L../lib -ldyn.so

​ ②系统环境变量LIBRARY_PATH:

export LIBRARY_PATH=./lib

2、运行时:

① 编译链接时候通过 -R选项(或 -rpath)指定 run-time path:

gcc tt.cc -o tt.out -Wl,-rpath=./

② 系统环境变量:
1、LD_LIBRARY_PATH:系统运行时让动态链接库加载器(ld.so)在运行时(run-time)有一个额外的搜索路径选项,即增加 一个搜索路径列表。出于安全原因,对于已设置setuid或setgid的可执行文件,LD_LIBRARY_PATH被完全忽略

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:path

2、LD_PRELOAD:允许你定义在程序运行前优先加载的动态链接库文件。这个功能主要就是用来有选择性的载入不同 动 态链接库中的相同函数。已达到动态库运行时覆盖的目的。

export LD_PRELOAD=./hack.so

/etc/ld.so.conf文件内存放可被全局共享的动态链接库所在目录:
[[email protected] sps]# ls /etc/ld.so.conf.d/
pau.conf                     HIKHost.conf                       mysql-x86_64.conf 
kernel-2.6.32-431.el6.x86_64.conf
[[email protected] sps]# cat /etc/ld.so.conf.d/pau.conf 
/home/netposa/pvg/pau
[[email protected] sps]# ldconfig

/etc/ld.so.conf包含/etc/ld.so.conf.d文件夹内配置文件, 配置好之后要通过ldconfig命令更新路径到 /etc/ld.so.cache缓存,ld.so会从该缓存查找

④ 将所生成的动态库,放入 /lib 或 /usr/lib 目录下

3、优先级

​ 以上方法配置的路径优先级依次降低

注意:234方法的影响是全局的,会影响到其他服务的库路径,不建议配置。如果一定要使用,可在局部环境下配置②环境变量。


参考:

https://blog.csdn.net/astrotycoon/article/details/9882227

https://www.cnblogs.com/openix/p/3521166.html