ldd命令及動態庫加載

1.在製作自己的發行版時經常需要判斷某條命令需要哪些共享庫文件的支持,以確保指定的命令在獨立的系統內可以可靠的運行;
在Linux環境下通過ldd命令即可實現,在終端下執行:
ldd /bin/ls //ldd命令通常使用"-v"或"--verbose"選項來顯示所依賴的動態連接庫的儘可能的詳細信息。
即可得到/bin/ls命令的相關共享庫文件列表:

libtermcap.so.2 => /lib/libtermcap.so.2 (0x4001c000) libc.so.6 => /lib/libc.so.6 (0x40020000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
注意:在 ldd 命令打印的結果中,“=>”左邊的表示該程序需要連接的共享庫之 so 名稱,右邊表示由 Linux 的共享庫系統找到的對應的共享庫在文件系統中的具體位置。默認情況下,/etc/ld.so.conf 文件中包含有默認的共享庫搜索路徑。

 

2.龍芯電腦中更新了庫文件時,經常會引起某些軟件無法使用,可以通過ldd命令來檢查軟件需要那些共享庫的支持,如:以前在安裝apt-get install devscripts軟件時安裝更新了很多庫,結果導致OpenOffice無法使用,可以使用命令:

#ldd /opt/openoffice.org2.0/program/soffice.bin

查看其依賴的共享庫文件。

 

知識點:

1、如果使用 ldd 命令時沒有找到對應的共享庫文件和其具體位置,可能是兩種情況引起的:

  1. 共享庫沒有安裝在該系統中;
  2. 共享庫保存在 /etc/ld.so.conf 文件列出的搜索路徑之外的位置。

通常情況下,許多開放源代碼的程序或函數庫都會默認將自己安裝到 /usr/local 目錄下的相應位置(如:/usr/local/bin 或 /usr/local/lib),以便與系統自身的程序或函數庫相區別。而許多 Linux 系統的 /etc/ld.so.conf 文件中默認又不包含 /usr/local/lib。因此,往往會出現已經安裝了共享庫,但是卻無法找到共享庫的情況。具體解決辦法如下:

檢查 /etc/ld.so.conf 文件,如果其中缺少 /usr/local/lib 目錄,就添加進去;注意:在修改了/etc/ld.so.conf 文件或者在系統中安裝了新的函數庫之後,需要運行一個命令:ldconfig ,該命令用來刷新系統的共享庫緩存,即 /etc/ld.so.cache 文件。爲了減少共享庫系統的庫搜索時間,共享庫系統維護了一個共享庫 so 名稱的緩存文件/etc/ld.so.cache。因此,在安裝新的共享庫之後,一定要運行 ldconfig 刷新該緩存。

2、使用nm命令也可以獲取庫函數的信息;nm命令可以列出一個函數庫文件中的符號表,它對靜態的庫函數和共享的庫函數都能起作用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章