每天一個 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