天天看點

ldconfig和ldd用法

原文連結:http://www.cppblog.com/aaxron/archive/2012/08/02/185995.html

ldconfig和ldd用法

一、ldconfig

ldconfig --help

Usage: ldconfig [OPTION...]

Configure Dynamic Linker Run Time Bindings.

  -c, --format=FORMAT        Format to use: new, old or compat (default)

  -C CACHE                   Use CACHE as cache file

  -f CONF                    Use CONF as configuration file

  -i, --ignore-aux-cache     Ignore auxiliary cache file

  -l                         Manually link individual libraries.

  -n                         Only process directories specified on the command

                             line.  Don't build cache.

  -N                         Don't build cache

  -p, --print-cache          Print cache

  -r ROOT                    Change to and use ROOT as root directory

  -v, --verbose              Generate verbose messages

  -X                         Don't generate links

  -?, --help                 Give this help list

      --usage                Give a short usage message

  -V, --version              Print program version

Mandatory or optional arguments to long options are also mandatory or optional

for any corresponding short options.

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

二、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等,看看程式的運作結果

3、ldd顯示可執行子產品的dependency的工作原理,其實質是通過ld-linux.so(elf動态庫的裝載器)來實作的。我們知道,ld-

linux.so子產品會先于executable子產品程式工作,并獲得控制權,是以當上述的那些環境變量被設定時,ld-linux.so選擇了顯示可執

行子產品的dependency。

4、實際上可以直接執行ld-linux.so子產品,如:/lib/ld-linux.so.2 --list program(這相當于ldd program)

繼續閱讀