2021-05-12 14:32:11
Linux的ldconfig命令和ldd命令用法
ldd 檢視程式依賴庫
ldd作用:用來檢視程式執行所需的共用庫,常用來解決程式因缺少某個庫檔案而不能執行的一些問題。
範例:檢視test程式執行所依賴的庫:
/opt/app/todeav1/test$ldd test
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00000039a7e00000)
libm.so.6 => /lib64/libm.so.6 (0x0000003996400000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000039a5600000)
libc.so.6 => /lib64/libc.so.6 (0x0000003995800000)
/lib64/ld-linux-x86-64.so.2 (0x0000003995400000)
•第一列:程式需要依賴什麼庫
•第二列: 系統提供的與程式需要的庫所對應的庫
•第三列:庫載入的開始地址
通過上面的資訊,我們可以得到以下幾個資訊:
1.通過對比第一列和第二列,我們可以分析程式需要依賴的庫和系統實際提供的,是否相匹配
2.通過觀察第三列,我們可以知道在當前的庫中的符號在對應的進程的地址空間中的開始位置
如果依賴的某個庫找不到,通過這個命令可以迅速定位問題所在;
註解
原理: ldd不是個可執行程式,而只是個shell指令碼; ldd顯示可執行模組的dependency的工作原理,其實質是通過ld-linux.so(elf動態庫的裝載器)來實現的。ld-linux.so模組會先於executable模組程式工作,並獲得控制權,因此當上述的那些環境變數被設定時,ld-linux.so選擇了顯示可執行模組的dependency。
---------------------------------------------------------------------
ldconfig是一個動態連結庫管理命令,為了讓動態連結庫為系統所共用,還需執行動態連結庫的管理命令–ldconfig。 ldconfig 命令的用途,主要是在預設搜尋目錄(/lib和/usr/lib)以及動態庫組態檔/etc/ld.so.conf內所列的目錄下,搜尋出可共用的動態 連結庫(格式如前介紹,lib*.so*),進而建立出動態裝入程式(ld.so)所需的連線和快取檔案.快取檔案預設為 /etc/ld.so.cache,此檔案儲存已排好序的動態連結庫名字列表.
linux下的共用庫機制採用了類似於快取記憶體的機制,將庫資訊儲存在/etc/ld.so.cache裡邊。
程式連線的時候首先從這個檔案裡邊查詢,然後再到ld.so.conf的路徑裡邊去詳細找。
這就是為什麼修改了ld.so.conf要重新執行一下ldconfig的原因
補充一點,ldconfig在/sbin裡面。
ldconfig幾個需要注意的地方
1. 往/lib和/usr/lib裡面加東西,是不用修改/etc/ld.so.conf的,但是完了之後要調一下ldconfig,不然這個library會找不到
2. 想往上面兩個目錄以外加東西的時候,一定要修改/etc/ld.so.conf,然後再呼叫ldconfig,不然也會找不到
比如安裝了一個mysql到/usr/local/mysql,mysql有一大堆library在/usr/local/mysql /lib下面,這時 就需要在/etc/ld.so.conf下面加一行/usr/local/mysql/lib,儲存過後ldconfig一下,新的library才能在 程式執行時被找到。
3. 如果想在這兩個目錄以外放lib,但是又不想在/etc/ld.so.conf中加東西(或者是沒有許可權加東西)。那也可以,就是export一個全域性變 量LD_LIBRARY_PATH,然後執行程式的時候就會去這個目錄中找library。一般來講這只是一種臨時的解決方案,在沒有許可權或臨時需要的時 候使用。
4. ldconfig做的這些東西都與執行程式時有關,跟編譯時一點關係都沒有。編譯的時候還是該加-L就得加,不要混淆了。
5. 總之,就是不管做了什麼關於library的變動後,最好都ldconfig一下,不然會出現一些意想不到的結果。不會花太多的時間,但是會省很多的事。
本文永久更新連結地址:http://www.linuxidc.com/Linux/2017-01/139071.htm
相關文章