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

在linux共享庫下,調用共享庫函數時,程序卡死在函數中的pid=fork()這里的原因?
Linux系統共享庫編程
Linux服務的內容如何查看

評論