天天看點

Linux系統指令 之 ldconfig、ldd

文章目錄

  • ​​一、ldconfig​​
  • ​​ldconfig幾個需要注意的地方​​
  • ​​ldconfig指令行用法​​
  • ​​ldconfig可用的選項說明​​
  • ​​二、ldd​​
  • ​​作用​​
  • ​​ldd指令原理​​

一、ldconfig

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幾個需要注意的地方

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一下,不然會出現一些意想不到的結果。不會花太多的時間,但是會省很多的事。

ldconfig指令行用法

ldconfig [-v|--verbose] [-n] [-N] [-X] [-f CONF] [-C CACHE] [-r ROOT] [-l] [-p|--print-cache]

[-c FORMAT] [--format=FORMAT] [-V] [-?|--help|--usage] path...      

ldconfig可用的選項說明

1) -v或–verbose : 用此選項時,ldconfig将顯示正在掃描的目錄及搜尋到的動态連結庫,還有它所建立的連接配接的名字;

2)-n : 用此選項時,ldconfig僅掃描指令行指定的目錄,不掃描預設目錄(/lib,/usr/lib),也不掃描配置檔案/etc/ld.so.conf所列的目錄;

3)-N : 此選項訓示ldconfig不重建緩存檔案(/etc/ld.so.cache),若未用-X選項,ldconfig照常更新檔案的連接配接;

4)-X : 此選項訓示ldconfig不更新檔案的連接配接,若未用-N選項,則緩存檔案正常更新;

5)-f CONF : 此選項指定動态連結庫的配置檔案為CONF,系統預設為/etc/ld.so.conf;

6)-C CACHE : 此選項指定生成的緩存檔案為CACHE,系統預設的是/etc/ld.so.cache,此檔案存放已排好序的可共享的動态連結庫的清單;

7)-r ROOT : 此選項改變應用程式的根目錄為ROOT(是調用chroot函數實作的),選擇此項時,系統預設的配置檔案 /etc/ld.so.conf,實際對應的為 ROOT/etc/ld.so.conf。如用-r /usr/zzz時,打開配置檔案 /etc/ld.so.conf時,實際打開的是/usr/zzz/etc/ld.so.conf檔案,用此選項,可以大大增加動态連結庫管理的靈活性;

8)-l : 通常情況下,ldconfig搜尋動态連結庫時将自動建立動态連結庫的連接配接,選擇此項時,将進入專家模式,需要手工設定連接配接,一般使用者不用此項;

9)-p或–print-cache : 此選項訓示ldconfig列印出目前緩存檔案所儲存的所有共享庫的名字;

10)-c FORMAT 或 --format=FORMAT : 此選項用于指定緩存檔案所使用的格式,共有三種: ld(老格式),new(新格式)和compat(相容格式,此為預設格式);

11)-V : 此選項列印出ldconfig的版本資訊,而後退出;

12)-? 或 --help 或 --usage : 這三個選項作用相同,都是讓ldconfig列印出其幫助資訊,而後退出。

二、ldd

作用

用來檢視程式運作所需的共享庫,常用來解決程式因缺少某個庫檔案而不能運作的一些問題。

ldd指令原理

1、首先ldd不是一個可執行程式,而隻是一個shell腳本;

2、ldd能夠顯示可執行子產品的dependency,其原理是通過設定一系列的環境變量,如:LD_TRACE_LOADED_OBJECTS、LD_WARN、LD_BIND_NOW、LD_LIBRARY_VERSION、LD_VERBOSE等。當LD_TRACE_LOADED_OBJECTS環境變量不為空時,任何可執行程式在運作時,它都會隻顯示子產品的dependency,而程式并不真正執行。可以在shell終端測試一下:

(1) export LD_TRACE_LOADED_OBJECTS=1

(2) 再執行任何的程式,如ls等,看看程式的運作結果

繼續閱讀