補充檢視編譯好的動態庫或者程序的rpath的方法
動態庫的搜尋路徑的順序
參考資料
gcc中的rpath引數可以用編譯時指定動態庫的搜尋路徑,這樣執行時就不需要export ld_library_path
了。
編譯時增加引數-wl,-rpath='.'
編譯時增加引數-wl,-z,origin -wl,-rpath='$origin'
$origin表示會搜尋程序所在目錄(同樣也可以設定-rpath=』$origin/lib』)。此方案不會出現方案一中軟鏈結找不到動態庫的情況。
通常情況下使用第二種方案是比較理想的,但是為了防止提公升許可權的漏洞,一旦進行了提公升許可權操作(比如chown root ping ;chmod u+s ping
),則origin的設定會失效,執行可執行程式,會提示找不到動態庫,即使使用export ld_library_path
設定了路徑也無效。
要解決此問題:
- 使用絕對路徑(此方案不可取,所以沒有親自試驗,應該是-rpath時指定絕對路徑)
- 將所依賴的so檔案拷貝到作業系統缺省會搜尋的目錄下,比如/lib
或者/lib64
等目錄
編譯目標**時指定的動態庫搜尋路徑;
環境變數 ld_library_path 指定的動態庫搜尋路徑;
配置檔案 /etc/ld.so.conf 中指定的動態庫搜尋路徑;
預設的動態庫搜尋路徑 /lib ;
預設的動態庫搜尋路徑 /usr/lib
gcc指定標頭檔案搜尋路徑及動態鏈結庫搜尋路徑
include 直接到系統指定的某些目錄中去找某些標頭檔案。include 先到原始檔所在資料夾去找,然後再到系統指定的某些目錄中去找某些標頭檔案。1.會在預設情況下指定到 usr include資料夾 更深層次的是乙個相對路徑,gcc可執行程式的路徑是 usr bin gcc,那麼它在實際工作時指...
linux動態庫載入時搜尋路徑
對動態庫的實際應用還不太熟悉的讀者可能曾經遇到過類似 error while loading shared libraries 這樣的錯誤,這是典型的因為需要的動態庫不在動態鏈結器ld.so的搜尋路徑設定當中導致的。1 elf可執行檔案中動態段中dt rpath所指定的路徑。這實際上是通過一種不算很...
gcc庫的搜尋路徑
1.ld會去找gcc命令中的引數 l 2.再找gcc的環境變數library path 3.再找內定目錄 lib usr lib usr local lib 這是當初compile gcc時寫在程式內的 動態鏈結時 執行時搜尋路徑順序 1.編譯目標 時指定的動態庫搜尋路徑 2.環境變數ld libr...