天天看點

【Linux】一步一步學Linux——ldd指令(251)

00. 目錄

文章目錄

    • 01. 指令概述
    • 02. 指令格式
    • 03. 常用選項
    • 04. 參考示例
    • 05. 其它描述
    • 06. 附錄

ldd指令用于列印程式或者庫檔案所依賴的共享庫清單。

用法:ldd [選項]... FILE...
           

-v	詳細資訊模式,列印所有相關資訊
-u	列印未使用的直接依賴
-d	執行重定位和報告任何丢失的對象
-r	執行資料對象和函數的重定位,并且報告任何丢失的對象和函數
--help	顯示幫助資訊
           

4.1 檢視指令依賴的庫

[deng@localhost ~]$ ldd /bin/vim
        linux-vdso.so.1 =>  (0x00007ffe885db000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f83328e0000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f83326b9000)
        libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f833248f000)
        libacl.so.1 => /lib64/libacl.so.1 (0x00007f8332286000)
        libgpm.so.2 => /lib64/libgpm.so.2 (0x00007f833207f000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f8331e7b000)
        libperl.so => /usr/lib64/perl5/CORE/libperl.so (0x00007f8331aed000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f83318d1000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f8331504000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f8332be2000)
        libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f83312a2000)
        libattr.so.1 => /lib64/libattr.so.1 (0x00007f833109d000)
        libncurses.so.5 => /lib64/libncurses.so.5 (0x00007f8330e76000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f8330c5d000)
        libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f8330a43000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f833080c000)
        libutil.so.1 => /lib64/libutil.so.1 (0x00007f8330609000)
        libfreebl3.so => /lib64/libfreebl3.so (0x00007f8330406000)
[deng@localhost ~]$ 
           

4.2 檢視指令依賴的庫

[deng@localhost ~]$ ldd $(which vim)
        linux-vdso.so.1 =>  (0x00007ffffc9bc000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fab2474e000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fab24527000)
        libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fab242fd000)
        libacl.so.1 => /lib64/libacl.so.1 (0x00007fab240f4000)
        libgpm.so.2 => /lib64/libgpm.so.2 (0x00007fab23eed000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fab23ce9000)
        libperl.so => /usr/lib64/perl5/CORE/libperl.so (0x00007fab2395b000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fab2373f000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fab23372000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fab24a50000)
        libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fab23110000)
        libattr.so.1 => /lib64/libattr.so.1 (0x00007fab22f0b000)
        libncurses.so.5 => /lib64/libncurses.so.5 (0x00007fab22ce4000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fab22acb000)
        libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fab228b1000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fab2267a000)
        libutil.so.1 => /lib64/libutil.so.1 (0x00007fab22477000)
        libfreebl3.so => /lib64/libfreebl3.so (0x00007fab22274000)
[deng@localhost ~]$ 
           

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

ldd能夠顯示可執行子產品的dependency,其原理是通過設定一系列的環境變量,如下:

LD_TRACE_LOADED_OBJECTS、LD_WARN、LD_BIND_NOW、LD_LIBRARY_VERSION、LD_VERBOSE

等。當

LD_TRACE_LOADED_OBJECTS

環境變量不為空時,任何可執行程式在運作時,它都會隻顯示子產品的dependency,而程式并不真正執行。要不你可以在shell終端測試一下,如下:

export LD_TRACE_LOADED_OBJECTS=1
           

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

繼續閱讀