1、依賴查詢
1.1 objdump
乙個 動態庫還可能依賴別的動態庫,可用以下命令去查詢[7]:
$ objdump -x lib***xx.so | grep needed
以libpng12.so.0為例,查詢結果如下:
liyihai@ubuntu:/lib/i386-linux-gnu$ objdump -x libpng12.so.0 | grep needed
needed libz.so.1
needed libm.so.6
needed libc.so.6
1.2 ldd[11]
還可以直接使用ldd命令檢視動態庫的依賴關係:
ldd lib***.so
2、-l、-rpath、-rpath-link
就算使用第1章的方法找到了libpng12.so.0所依賴的庫,而且放到和libpng12.so.0同乙個目錄中,編譯時還是可能找不到。使用-l可以指定可執行檔案編譯時需要的庫目錄,而動態庫依賴於其它庫的目錄需要使用-rpath、rpath-link來指定[9]。
由於-rpath、rpath-link都是ld的引數,而不是gcc的,因此如果是gcc中使用這兩個引數,要使用-wl選項[10],例如:
$gcc hello.c -wl,-rpath-link /usr/local/lib
3、函式
如果知道.so中包含了那些函式呢?,以libc.so.6為例,使用以下命令可以查詢其中包含的函式[1]。
$ readelf -s libc.so.6
參考資料
[1]linux下,怎麼用shell命令或指令碼檢視.so檔案裡面的所有函式名
[2]linux下檢視動態鏈結庫so檔案的依賴的相關組建
[4]linux下so動態庫一些不為人知的秘密(中)
[6]怎麼讓gcc編譯出來的so檔案不依賴於libgcc_s.so.1?
[7]在linux下檢視so的依賴庫
[8]linux下如何檢視共享庫so版本號
[9]動態庫的鏈結和鏈結選項-l,-rpath-link,-rpath
[10]ld的-rpath與-rpath-link選項
[11]linux下檢視動態鏈結庫依賴關係的命令
gcc指定標頭檔案路徑及動態鏈結庫路徑
include 直接到系統指定的某些目錄中去找某些標頭檔案。include 先到原始檔所在資料夾去找,然後再到系統指定的某些目錄中去找某些標頭檔案。1.會在預設情況下指定到 usr include資料夾 更深層次的是乙個相對路徑,gcc可執行程式的路徑是 usr bin gcc,那麼它在實際工作時指...
Linux下動態鏈結庫載入路徑及搜尋路徑問題
引子 近日,伺服器遷移後,偷懶未重新編譯nginx的,直接.nginx啟動,結果遇到如下問題 error while loading shared libraries 這是是因為需要的動態庫不在動態鏈結器ld.so的搜尋路徑導致。ld.so 程式設計客棧動態共享庫搜尋順序 1 elf可執行檔案中動態...
Ubuntu linux 新增動態鏈結庫路徑
include etc ld.so.conf.d conf usr local lib 然後更新 etc so.cache sudo ldconfig usr local lib 方法三 設定 ld library path 庫所在目錄 多個目錄用 分隔 回到頂部 以root身份把庫路徑加入到 et...