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