1.命令简介 ldd 命令用于打印程序或者共享库文件所依赖的共享库列表。
/ e* w6 g i2 _" M& X
注意,ldd 本身不是一个二进制程序,而是一个 Shell 脚本,使用文本编辑器 vim 可以查看其内容,具体目录可以使用 which 命令查看: - 9 Q) ]0 y" h0 M0 o( l
- which ldd! z: I2 F5 O# m: M$ A# t) V, X# c5 K
- /usr/bin/ldd
复制代码我们知道,Linux 的动态库装载器 ld-linux.so 模块会先于 executable 模块工作,并获得控制权,ld-linux.so 会通过系统环境变量的设置,选择只显示可执行模块的dependency,而不运行可执行模块。 : [" J+ O, e. M# v9 G; J
相关环境变量有:
* Y2 M/ H% N& y' E* D9 ]- LD_TRACE_LOADED_OBJECTS* K5 i* _' Y: E( t9 L
- LD_WARN; H& o& f2 x# J% x/ @2 M
- LD_BIND_NOW- \8 L& z# n Y- C
- LD_LIBRARY_VERSION$ N- B1 h c, G9 u9 p: A) g- e
- LD_VERBOSE+ n' x) @. _3 u/ f
- LD_DEBUG
复制代码ldd 默认开启的环境变量是:LD_TRACE_LOADED_OBJECTS=1。 . B p3 n5 x; {$ ?7 d5 j* L: y
也就是说,LD_TRACE_LOADED_OBJECTS为必要环境变量,其他环境变量的设置是可选的。
: @ {8 D2 J* M0 E: q% I; \
其他的变量的设置与ldd命令选项的对应关系如下: - / E( d9 \, m# }+ U
- -d, --data-relocs -> LD_WARN=yes9 y" D0 R/ v$ w( c
- -r, --function-relocs ->LD_WARN和LD_BIND_NOW=yes, C& M4 P9 Q4 J0 ?: S2 D
- -u, --unused -> LD_DEBUG="unused"
4 V) R" V, J e8 ?1 f2 K8 o - -v, --verbose -> LD_VERBOSE=yes
复制代码比如设置LD_TRACE_LOADED_OBJECTS环境变量不为空时,任何可执行程序在运行时,都会只显示依赖的动态库,程序并不真正地执行。 Q8 G( q$ Y& l# o5 _- S
测试如下: - , b; Y y* k3 P1 I) i
- export LD_TRACE_LOADED_OBJECTS=1
7 @) V6 n5 y' m D - ls! n: r7 g n/ g* ?8 R6 _8 ^: L
- linux-vdso.so.1 => (0x00007ffd1d3cf000)
* D. h/ z$ z2 U - /$LIB/libonion.so => /lib64/libonion.so (0x00007fbbe7162000)
- h1 H% v- t N- p' W7 J9 T6 P - libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fbbe6e2e000)
) C! B5 J7 E2 [2 T* k9 g& K5 Y1 P# l9 h$ K - libcap.so.2 => /lib64/libcap.so.2 (0x00007fbbe6c29000)( n5 @$ _7 \. }+ J4 r1 p$ F% J
- libacl.so.1 => /lib64/libacl.so.1 (0x00007fbbe6a20000): Y0 `( k0 V) `( b0 X. m" ~* c0 V/ c
- libc.so.6 => /lib64/libc.so.6 (0x00007fbbe665e000)
+ h3 f/ }( G7 y4 i& c; g: ~' A3 w - libdl.so.2 => /lib64/libdl.so.2 (0x00007fbbe645a000)
& Y2 K R2 x7 N' P9 A0 E2 E6 ` - libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fbbe623e000)
* d3 s- k/ c2 v - libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fbbe5fdd000)
2 B2 E# C' W3 L6 {. x - liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fbbe5db8000)
) H. x( R! {) Z - /lib64/ld-linux-x86-64.so.2 (0x00007fbbe7053000)$ }9 |" y1 q1 {- c# S, k# P+ a
- libattr.so.1 => /lib64/libattr.so.1 (0x00007fbbe5bb3000)
复制代码撤销该环境变量,ls 即可恢复正常使用:
: M( X" V5 x9 y# M* {- E5 x- unset LD_TRACE_LOADED_OBJECTS
8 _% Z/ L9 K( |& c$ l - ls8 m: f$ g- B0 y. m h1 ?
- Changelog Changelog.ln dablelv txt.txt
复制代码由此可见,ldd 命令其实是通过设置 ld-linux.so 依赖的环境变量来影响 ld-linux.so的工作方式,使得可执行模块加载时显示其依赖的动态库。 4 f- v, m# @* ^- V9 \
实际上可以直接执行 ld-linux.so 模块,如/lib/ld-linux.so.2 --list program,来达到命令ldd program的效果。 0 }8 E4 l2 y0 u5 J+ g# M/ x
2.命令格式
5 H0 `: q A2 N7 C( L- ldd [OPTIONS] <FILES>
复制代码
1 e* n- B5 [: t. C9 h( g) N4 ]其中[OPTIONS]为可选的命令选项,...为必填的程序或者共享库文件列表。
! D+ p/ S" F+ _$ r+ i# V" u3.选项说明. h# q9 z- n6 j5 ]7 Q
- ; l1 `" x, K. ]$ u- F1 e
- --version:打印ldd版本号3 Z' M8 P5 j/ A B w1 j& W
- -v, --verbose:详细信息模式,打印所有相关信息) b- \$ X, k5 _, D* `4 ]8 e: B
- -u, --unused:打印未使用的直接依赖
7 a7 Q& W8 Y5 e* R; V; G - -d, --data-relocs:执行重定位和报告任何丢失的对象+ y7 ?. ~' ]: ~& G; C# C8 y
- -r, --function-relocs:执行数据对象和函数的重定位,并且报告任何丢失的对象和函数。(只对ELF格式文件有效)% D# X' m, C* b
- --help:显示帮助信息
复制代码 4.示例说明(1)显示可执行文件依赖的动态链接库。 - 9 b7 ^( O" Q+ V9 g$ t
- ldd /usr/bin/ls- t( H* T0 I4 R; X( E
- linux-vdso.so.1 => (0x00007ffd90514000)
1 {( A) P, i3 ~8 d7 M# c* a/ y5 d" F - /$LIB/libonion.so => /lib64/libonion.so (0x00007f294ade8000)
! ~1 p5 m) J; |1 i - libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f294aab4000)5 L" X w) z$ a0 I- k& U1 j
- libcap.so.2 => /lib64/libcap.so.2 (0x00007f294a8af000)7 Q0 G2 V* U, e7 x
- libacl.so.1 => /lib64/libacl.so.1 (0x00007f294a6a6000)1 n5 `% M, j3 _$ @9 C
- libc.so.6 => /lib64/libc.so.6 (0x00007f294a2e4000)
, g0 L% j# ~; s9 H$ H6 z5 w* x4 B1 q - libdl.so.2 => /lib64/libdl.so.2 (0x00007f294a0e0000)* ]! B; ~1 v5 B h, D
- libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2949ec4000)
8 q+ c' ]! f0 D6 f& A* {+ d - libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f2949c63000), [# v- c; |0 X$ U* d# f
- liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f2949a3e000)
- h% D2 r9 h; o) s9 W+ x - /lib64/ld-linux-x86-64.so.2 (0x00007f294acd9000)
. P4 S' U9 w" g' Z - libattr.so.1 => /lib64/libattr.so.1 (0x00007f2949839000)
复制代码
; K' F/ E: D+ _' C* X# U7 o3 l( D: ~, V$ o$ e+ x8 H
|