繼續上一篇《
linux下so動態庫一些不為人知的秘密(中) 》介紹so搜索路徑,還有一個類似于
-path,叫LD_RUN_PATH環境變量, 它也是把路徑編譯進可執行文件內,不同的是它只設置RPATH。
[stevenrao] $ g++ -o demo -L /tmp/ -ltmp main.cpp
[stevenrao] $ readelf -d demo
Dynamic section at offset 0xb98 contains 25 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libtmp.so]
....
0x000000000000000f (RPATH) Library rpath: [/tmp/]
另外還可以通過配置/etc/ld.so.conf,在其中加入一行
/tmp/
這個配置項也是只對運行期有效,并且是全局用戶都生效,需要root權限修改,修改完后需要使用命令ldconfig 將 /etc/ld.so.conf 加載到ld.so.cache中,避免重啟系統就可以立即生效。
除了前面介紹的那些搜索路徑外,還有缺省搜索路徑/usr/lib/ /lib/ 目錄,可以通過-z nodefaultlib編譯選項禁止搜索缺省路徑。
[stevenrao] $ g++ -o demo -z nodefaultlib -L/tmp -ltmp main.cpp
[stevenrao] $ ./demo
./demo: error while loading shared libraries: libstdc++.so.6: cannot open shared object file
這么多搜索路徑,他們有個先后順序如下
1、RUMPATH 優先級最高
2、RPATH 其次
3、LD_LIBRARY_PATH
4、/etc/ld.so.cache
5、/usr/lib/ /lib/
查看一個程序搜索其各個動態庫另一個簡單的辦法是使用 LD_DEBUG這個環境變量;
[stevenrao] $ export LD_DEBUG=libs
[stevenrao] $ ./demo
下一篇介紹動態庫內符號問題