每天一個 Linux 命令: ldd 命令
1. 命令簡介
ldd
命令用於打印程序或者共享庫文件所依賴的共享庫列表。
注意,ldd
本身不是一個二進制程序,而是一個 Shell 腳本,使用文本編輯器 vim 可以查看其內容,具體目錄可以使用 which
命令查看:
which ldd
/usr/bin/ldd
我們知道,Linux 的動態庫裝載器 ld-linux.so 模塊會先於 executable 模塊工作,並獲得控制權,ld-linux.so 會通過系統環境變量的設置,選擇只顯示可執行模塊的 dependency,而不運行可執行模塊。
相關環境變量有:
LD_TRACE_LOADED_OBJECTS
LD_WARN
LD_BIND_NOW
LD_LIBRARY_VERSION
LD_VERBOSE
LD_DEBUG
ldd 默認開啓的環境變量是:LD_TRACE_LOADED_OBJECTS=1。
也就是說,LD_TRACE_LOADED_OBJECTS 爲必要環境變量,其他環境變量的設置是可選的。
其他的變量的設置與 ldd 命令選項的對應關係如下:
-d, --data-relocs -> LD_WARN=yes
-r, --function-relocs ->LD_WARN和LD_BIND_NOW=yes
-u, --unused -> LD_DEBUG="unused"
-v, --verbose -> LD_VERBOSE=yes
比如設置 LD_TRACE_LOADED_OBJECTS 環境變量不爲空時,任何可執行程序在運行時,都會只顯示依賴的動態庫,程序並不真正地執行。
測試如下:
export LD_TRACE_LOADED_OBJECTS=1
ls
linux-vdso.so.1 => (0x00007ffd1d3cf000)
/$LIB/libonion.so => /lib64/libonion.so (0x00007fbbe7162000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fbbe6e2e000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007fbbe6c29000)
libacl.so.1 => /lib64/libacl.so.1 (0x00007fbbe6a20000)
libc.so.6 => /lib64/libc.so.6 (0x00007fbbe665e000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fbbe645a000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fbbe623e000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fbbe5fdd000)
liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fbbe5db8000)
/lib64/ld-linux-x86-64.so.2 (0x00007fbbe7053000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007fbbe5bb3000)
撤銷該環境變量,ls 即可恢復正常使用:
unset LD_TRACE_LOADED_OBJECTS
ls
Changelog Changelog.ln dablelv txt.txt
由此可見,ldd 命令其實是通過設置 ld-linux.so 依賴的環境變量來影響 ld-linux.so 的工作方式,使得可執行模塊加載時顯示其依賴的動態庫。
實際上可以直接執行 ld-linux.so 模塊,如 / lib/ld-linux.so.2 --list program,來達到命令 ldd program 的效果。
2. 命令格式
ldd [OPTIONS] <FILES>
其中 [OPTIONS] 爲可選的命令選項,... 爲必填的程序或者共享庫文件列表。
3. 選項說明
--version:打印ldd版本號
-v, --verbose:詳細信息模式,打印所有相關信息
-u, --unused:打印未使用的直接依賴
-d, --data-relocs:執行重定位和報告任何丟失的對象
-r, --function-relocs:執行數據對象和函數的重定位,並且報告任何丟失的對象和函數。(只對ELF格式文件有效)
--help:顯示幫助信息
4. 示例說明
(1)顯示可執行文件依賴的動態鏈接庫。
ldd /usr/bin/ls
linux-vdso.so.1 => (0x00007ffd90514000)
/$LIB/libonion.so => /lib64/libonion.so (0x00007f294ade8000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f294aab4000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007f294a8af000)
libacl.so.1 => /lib64/libacl.so.1 (0x00007f294a6a6000)
libc.so.6 => /lib64/libc.so.6 (0x00007f294a2e4000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f294a0e0000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2949ec4000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f2949c63000)
liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f2949a3e000)
/lib64/ld-linux-x86-64.so.2 (0x00007f294acd9000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007f2949839000)
轉自:戀貓大鯉魚 blog.csdn.net/K346K346/article/details/89062163
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/5yDT9MPUP7GZtL91f7A-CQ