ldconfig一般在系統啓動時運行,而當用戶安裝了一個新的動態連接庫時,就須要手工運行這個命令.mysql
--ldconfig ldconfig 命令的用途,主要是在默認搜尋目錄(/lib和/usr/lib)以及動態庫配置文件/etc/ld.so.conf內所列的目錄下,搜索出可共享的動態連接庫(格式如前介紹,lib*.so*),進而建立出動態裝入程序(ld.so)所需的鏈接和緩存文件.緩存文件默認爲 /etc/ld.so.cache,此文件保存已排好序的動態連接庫名字列表.linux
ldconfig命令行用法以下:sql
ldconfig [-v|--verbose] [-n] [-N] [-X] [-f CONF] [-C CACHE] [-r ROOT] [-l] [-p|--print-cache] [-c FORMAT] [--format=FORMAT] [-V] [-?|--help|--usage] path...shell
ldconfig可用的選項說明以下:緩存
(1) -v或--verbose : 用此選項時,ldconfig將顯示正在掃描的目錄及搜索到的動態連接庫,還有它所建立的鏈接的名字.函數
(2) -n : 用此選項時,ldconfig僅掃描命令行指定的目錄,不掃描默認目錄(/lib,/usr/lib),也不掃描配置文件/etc/ld.so.conf所列的目錄.測試
(3) -N : 此選項指示ldconfig不重建緩存文件(/etc/ld.so.cache).若未用-X選項,ldconfig照常更新文件的鏈接.spa
(4) -X : 此選項指示ldconfig不更新文件的鏈接.若未用-N選項,則緩存文件正常更新.命令行
(5) -f CONF : 此選項指定動態連接庫的配置文件爲CONF,系統默認爲/etc/ld.so.conf.orm
(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 : 此選項用於指定緩存文件所使用的格式,共有三種:old(老格式),new(新格式)和compat(兼容格式,此爲默認格式).
(11) -V : 此選項打印出ldconfig的版本信息,然後退出.
(12) -? 或 --help 或 --usage : 這三個選項做用相同,都是讓ldconfig打印出其幫助信息,然後退出.
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不是一個可執行程序,而只是一個shell腳本
二、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等,看看程序的運行結果
三、ldd顯示可執行模塊的dependency的工做原理,其實質是經過ld-linux.so(elf動態庫的裝載器)來實現的。咱們知道,ld-linux.so模塊會先於executable模塊程序工做,並得到控制權,所以當上述的那些環境變量被設置時,ld-linux.so選擇了顯示可執行模塊的dependency。
四、實際上能夠直接執行ld-linux.so模塊,如:/lib/ld-linux.so.2 --list program(這至關於ldd program)ldd命令使用方法(摘自ldd --help)
名稱 ldd - 打印共享庫的依賴關係
大綱 ldd [選項]... 文件...
描述 ldd 輸出在命令行上指定的每一個程序或共享庫須要的共享庫。
選項
--version
打印ldd的版本號
-v --verbose
打印全部信息,例如包括符號的版本信息
-d --data-relocs
執行符號重部署,並報告缺乏的目標對象(只對ELF格式適用)
-r --function-relocs
對目標對象和函數執行從新部署,並報告缺乏的目標對象和函數(只對ELF格式適用)
--help 用法信息
ldd的標準版本與glibc2一塊兒提供。Libc5與老版本之前提供,在一些系統中還存在。在libc5版本中長選項不支持。另外一方面,glibc2版本不支持-V選項,只提供等價的--version選項。
若是命令行中給定的庫名字包含'/',這個程序的libc5版本將使用它做爲庫名字;不然它將在標準位置搜索庫。運行一個當前目錄下的共享庫,加前綴"./"。
ldd不能工做在a.out格式的共享庫上。
ldd不能工做在一些很是老的a.out程序上,這些程序在支持ldd的編譯器發行前已經建立。若是你在這種類型的程序上使用ldd,程序將嘗試argc = 0的運行方式,其結果不可預知。