Linux的ldconfig命令和ldd命令用法


1、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.通過觀察第三列,我們可以知道在當前的庫中的符號在對應的進程的地址空間中的開始位置 

如果依賴的某個庫找不到,通過這個命令可以迅速定位問題所在; 

注解及用法 :

       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)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的運行方式,其結果不可預知。

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

注釋及用法:

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 : 此選項用於指定緩存文件所使用的格式,共有三種:old(老格式),new(新格式)和compat(兼容格式,此為默認格式).

(11) -V : 此選項打印出ldconfig的版本信息,而后退出.

(12) -? 或 --help 或 --usage : 這三個選項作用相同,都是讓ldconfig打印出其幫助信息,而后退出.

 

建議三篇一起看

https://www.cnblogs.com/liushui-sky/p/13521898.html

https://www.cnblogs.com/liushui-sky/p/13521525.html 

 https://www.cnblogs.com/liushui-sky/p/13521639.html

 

轉自:

https://www.linuxidc.com/Linux/2017-01/139071.htm

https://www.cnblogs.com/zhouhbing/p/5109750.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM