要找出某個特定可執行依賴的庫,可以使用ldd命令。這個命令調用動態鏈接器去找到程序的庫文件依賴關系。
$ ldd /path/to/program
注意!並不推薦為任何不可信的第三方可執行程序運行ldd,因為某些版本的ldd可能會直接調用可執行程序來明確其庫文件依賴關系,這樣可能不安全。
取而代之的是用一個更安全的方式來顯示一個未知應用程序二進制文件的庫文件依賴,使用如下命令:
$ objmp -p /path/to/program | grep NEEDED
查看運行進程的共享庫依賴關系
如果你想要找出被一個運行中的進程載入的共享庫,你可以使用pldd命令,它會顯示出在運行時被載入一個進程里的所有共享對象。
$ sudo pldd
注意你需要root許可權去執行pldd命令。
或者,也可以選擇一個叫做pmap的命令行工具。它報告一個進程的內存映射,也能顯示出運行進程的庫文件依賴。
$ sudo pmap
2. 當我們在linux裡面執行一個可執行文件報not found的時候如何處理,背後的原理是什麼
在Linux中執行可執行文件時,若遇到"not found"錯誤,以blastp為例,首先,使用"file"命令檢查文件屬性,發現為可移植文件,包含動態鏈接庫依賴,運行於Linux-x86-64版本。接著,通過"ldd"查看依賴的動態庫,發現"libbz2.so.1"與"ld-linux-x86-64.so.2"未找到。"ld-linux-x86-64.so.2"找不到時,可能暗示操作系統底層存在依賴問題。檢查基礎鏡像操作系統,發現使用的是alpine,其中閹割了Linux基礎庫。改用ubuntu鏡像,對比發現ubuntu包含alpine中缺失的文件。
理解這一問題背後,需要掌握Linux中靜態鏈接庫和動態鏈接庫的原理。靜態鏈接庫在編譯時與程序一起鏈接,形成單一文件,而動態鏈接庫在運行時動態載入。不同鏡像中庫的差異導致依賴問題,選擇合適的鏡像環境能解決執行問題。
總之,解決Linux執行文件時的"not found"錯誤,關鍵在於理解文件屬性與依賴庫的原理,選擇合適的基礎鏡像環境。掌握這一知識,能有效應對類似問題。