红联Linux门户
Linux帮助

Linux运行时动态库搜索路径优先级

发布时间:2016-09-26 09:06:10来源:linux网站作者:astrotycoon
LIBRARY_PATH和LD_LIBRARY_PATH环境变量的区别
LIBRARY_PATH和LD_LIBRARY_PATH是Linux下的两个环境变量,二者的含义和作用分别如下:
LIBRARY_PATH环境变量用于在程序编译期间查找动态链接库时指定查找共享库的路径,例如,指定gcc编译需要用到的动态链接库的目录。
LD_LIBRARY_PATH环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径,注意,LD_LIBRARY_PATH中指定的路径会在系统默认路径之前进行查找。
 
区别与使用:
开发时,设置LIBRARY_PATH,以便gcc能够找到编译时需要的动态链接库。
发布时,设置LD_LIBRARY_PATH,以便程序加载运行时能够自动找到需要的动态链接库。
例外,我们还通过在/etc/ld.so.conf加入库的所在路径来达到与LD_LIBRARY_PATH同样的目的! 不同的是修改过该文件后应该运行sudo ldconfig
 
补充:
程序运行时动态库的搜索优先级:
Linux运行时动态库搜索路径优先级
1.编译目标代码时指定的动态库搜索路径(DT_RUNPATH为空,DT_RPATH不为空)。 
例如:gcc main.c -Wl,-rpath,库的路径
2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径(对setuid/setgid的程序无效,并且可以被链接器选项--library-path覆盖)
3.DT_RUNPATH指定的动态库搜索路径(-Wl,--enable-new-dtags)
4.配置文件/etc/ld.so.conf中指定的动态库搜索路径
5.默认的动态库搜索路径/lib
6.默认的动态库搜索路径/usr/lib
 
另外,查看一个程序搜索其各个动态库的一个简单方法是使用LD_DEBUG环境变量
[astrol] $ export LD_DEBUG=libs
[astrol] $ ./demo
使用ldd -u可以看出程序不需要链接的so,使用-Wl,--as-needed编译选项就可以去除不需要链接的so
 
GCC里的链接器的选项是 -rpath 和 -rpath-link,看了下 man ld,大致是这个意思: 
GCC链接选项-L,-rpath-link和-rpath
-L: “链接”的时候,去找的目录,也就是所有的 -lFOO 选项里的库,都会先从 -L 指定的目录去找,然后是默认的地方。
-rpath-link:这个也是用于“链接”的时候的,例如你显示指定的需要 FOO.so,但是 FOO.so 本身是需要 BAR.so 的,后者你并没有指定,而是 FOO.so 引用到它,这个时候,会先从 -rpath-link 给的路径里找。
-rpath: “运行”的时候,去找的目录。运行的时候,要找 .so 文件,会从这个选项里指定的地方去找。对于交叉编译,只有配合 --sysroot 选项才能起作用。
也就是说,-rpath指定的路径会被记录在生成的可执行程序中,用于运行时。
-rpath-link 则只用于链接时。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/24481.html