您的位置:首页 > 其它

LIBRARY_PATH和LD_LIBRARY_PATH环境变量的区别

2013-08-10 18:15 204 查看
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环境变量

[stevenrao] $ export LD_DEBUG=libs

[stevenrao] $ ./demo

使用ldd -u可以看出程序不需要链接的so,使用-Wl,--as-needed编译选项就可以去除不需要链接的so

GCC里的链接器的选项是 -rpath 和 -rpath-link,看了下 man ld,大致是这个意思:

GCC链接选项-L,-rpath-link和-rpath

-L: “链接”的时候,去找的目录,也就是所有的 -lFOO 选项里的库,都会先从 -L 指定的目录去找,然后是默认的地方。

-rpath_link (或者 -rpath-link):这个也是用于“链接”的时候的,例如你显示指定的需要 FOO.so,但是 FOO.so 本身是需要 BAR.so 的,后者你并没有指定,而是 FOO.so 引用到它,这个时候,会先从 -rpath-link 给的路径里找。

-rpath: “运行”的时候,去找的目录。运行的时候,要找 .so 文件,会从这个选项里指定的地方去找。对于交叉编译,只有配合 --sysroot 选项才能起作用。

也就是说,-rpath指定的路径会被记录在生成的可执行程序中,用于运行时。

-rpath-link 则只用于链接时。

参考链接: http://blog.lxgcc.net/?tag=dt_runpath
http://blog.lxgcc.net/?page_id=159 (about ELF)

http://www.catonmat.net/blog/simple-ld-preload-tutorial-part-2/ (about LD_PRELOAD)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: