linux下so動態庫一些不為人知的秘密(中二)

2021-09-22 21:45:58 字數 1435 閱讀 1794

》介紹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

linux下so動態庫一些不為人知的秘密

linux 下有動態庫和靜態庫,動態庫以.so為副檔名,靜態庫以.a為副檔名。二者都使用廣泛。本文主要講動態庫方面知識。基本上每乙個linux 程式都至少會有乙個動態庫,檢視某個程式使用了那些動態庫,使用 ldd命令檢視 ldd bin ls linux vdso.so.1 0x00007fff59...

linux下so動態庫一些不為人知的秘密(中)

介紹了linux下so一些依賴問題,本篇將介紹linux的so路徑搜尋問題。我們知道linux鏈結so有兩種途徑 顯示和隱式。所謂顯示就是程式主動呼叫dlopen開啟相關so 這裡需要補充的是,如果使用顯示鏈結,上篇文章討論的那些問題都不存在。首先,dlopen的so使用ldd是檢視不到的。其次,使...

linux下so動態庫一些不為人知的秘密(中)

本篇將介紹linux的so路徑搜尋問題。我們知道linux鏈結so有兩種途徑 顯示和隱式。所謂顯示就是程式主動呼叫dlopen開啟相關so 這裡需要補充的是,如果使用顯示鏈結,上篇文章討論的那些問題都不存在。首先,dlopen的so使用ldd是檢視不到的。其次,使用dlopen開啟的so並不是在程序...