一、開篇
在linux系統(tǒng)中,程序通常需要依賴于外部庫來正常工作。這些庫可以直接編譯到程序中,也可以從共享庫池中加載。使用共享庫有助于減小程序大小,簡化開發(fā)和打包。在linux中,共享庫通常存儲在/lib或/usr/lib目錄下。
不同的linux發(fā)行版甚至同一發(fā)行版的版本可能使用不同的庫,從而導(dǎo)致一個發(fā)行版編譯的程序在另一個發(fā)行版上運(yùn)行出現(xiàn)故障。當(dāng)系統(tǒng)中缺少所需庫時,這時可能會遇到錯誤。在嵌入式linux環(huán)境中,庫文件更是非常關(guān)鍵,因為嵌入式linux中硬件環(huán)境往往具有嚴(yán)苛的限制,太多的庫將無法完整放入對應(yīng)的硬件環(huán)境下,所以重新組建linux下的運(yùn)行庫在嵌入式linux設(shè)計中是重要的一環(huán)操作。
要解決共享庫加載的問題,我們可以使用一些工具和命令來確定程序所依賴的共享庫,本文將討論實現(xiàn)這一目標(biāo)的幾種方法。
二、ldd命令
ldd命令用于打印出共享對象的依賴。語法如下:
ldd[選項]文件
可選的參數(shù)如下:
--help印出這份說明然后離開 --version印出版本信息然后離開 -d,--data-relocs進(jìn)程數(shù)據(jù)重尋址 -r,--function-relocs進(jìn)程數(shù)據(jù)和函數(shù)重尋址 -u,--unused印出未使用的直接依賴關(guān)系 -v,--verbose印出所有信息
例如:
使用-v可查看更詳細(xì)的信息:
注意,使用ldd命令時可能會導(dǎo)致程序運(yùn)行,因此不要在不受信任的可執(zhí)行文件上使用ldd。
三、readelf命令
readelf命令是一個強(qiáng)大的命令,用于顯示ELF文件的信息,可使用該命令查看共享庫的依賴,方法如下:
readelf--dynamic./app|grepNEEDED
例如下列命令用于查看/usr/bin/dir的依賴庫:
四、objdump命令
objdump命令在開發(fā)中也是一個較為常用的命令,且功能強(qiáng)大,用于顯示對象文件中的信息,可以使用該命令來查看共享庫的依賴,方法如下:
objdump-p/path/to/program|grepNEEDED
例如下列命令用于查看/usr/bin/dir的依賴庫:
五、pldd命令
六、/proc//maps
通過檢查/proc/
awk'/.so/{print$6}'/proc/$(pgrepbash|head-n1)/maps|sort-u
例如:
上述語句中pgrep bash | head -n1表示獲取第一個名為bash的進(jìn)程的ID。
七、使用pmap收集程序的共享庫需求
pmap$(pgrepXorg|head-n1)|grep.so|awk'{print$4}'|sort-u
上述語句中pgrep bash | head -n1表示獲取第一個名為bash的進(jìn)程的ID。
八、使用lsof工具檢查正在運(yùn)行的進(jìn)程的共享庫需求
使用方法:
lsof-p$(pgrepbash|head-n1)|grepmem
上述語句中pgrep bash | head -n1表示獲取第一個名為bash的進(jìn)程的ID。
九、總結(jié)
在發(fā)行版的linux系統(tǒng)中,上述命令幾乎都可以使用來查看動態(tài)庫的依賴關(guān)系,在嵌入式linux系統(tǒng)中,可能由于網(wǎng)絡(luò)環(huán)境的限制、運(yùn)行架構(gòu)的不同、構(gòu)建的文件系統(tǒng)中不存在對應(yīng)的命令程序,從而導(dǎo)致上述一些命令無法運(yùn)行或者找不到運(yùn)行的命令,這時候常使用readelf和objdump查看動態(tài)庫的依賴關(guān)系,因為在交叉編譯構(gòu)建工具鏈中一般會包含readelf和objdump命令的變體。
審核編輯:劉清
-
嵌入式
+關(guān)注
關(guān)注
5121文章
19413瀏覽量
312403 -
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
601瀏覽量
28105 -
ELF文件
+關(guān)注
關(guān)注
0文章
14瀏覽量
7242 -
Bash
+關(guān)注
關(guān)注
0文章
57瀏覽量
10338
原文標(biāo)題:八種查看linux程序共享庫的方法,了解多少?
文章出處:【微信號:嵌入式小生,微信公眾號:嵌入式小生】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
Linux系統(tǒng)下查看elf文件的方法

在linux共享庫下,調(diào)用共享庫函數(shù)時,程序卡死在函數(shù)中的pid=fork()這里的原因?
Linux系統(tǒng)共享庫編程
Linux下靜態(tài)庫和動態(tài)庫(共享庫)的制作與使用
linux靜態(tài)庫和動態(tài)庫分析
你知道linux 靜態(tài)庫和共享庫?
linux共享程序庫剖析
Linux下C語言共享庫的位置無關(guān)實現(xiàn)原理分析
如何查看linux端口
Linux服務(wù)的內(nèi)容如何查看

評論