1.命令简介 ldd 命令用于打印程序或者共享库文件所依赖的共享库列表。 " ^4 H1 c( Z" H. J
注意,ldd 本身不是一个二进制程序,而是一个 Shell 脚本,使用文本编辑器 vim 可以查看其内容,具体目录可以使用 which 命令查看:
8 r. W$ r ~ _# j$ M9 O- which ldd
6 A* E1 `1 A% t - /usr/bin/ldd
复制代码我们知道,Linux 的动态库装载器 ld-linux.so 模块会先于 executable 模块工作,并获得控制权,ld-linux.so 会通过系统环境变量的设置,选择只显示可执行模块的dependency,而不运行可执行模块。
3 h7 @0 C* L0 ?! R$ f
相关环境变量有:
. R8 A }' J& w% ?- LD_TRACE_LOADED_OBJECTS3 N/ j5 ?$ c) p2 n3 a
- LD_WARN' D- ^+ x9 w. Y6 H9 L- @
- LD_BIND_NOW9 ~( |7 Q& X0 q T4 Q2 }7 e
- LD_LIBRARY_VERSION
a$ l- `4 z4 j$ d) F, j - LD_VERBOSE3 U8 ]7 Z. g5 \* T7 [- E
- LD_DEBUG
复制代码ldd 默认开启的环境变量是:LD_TRACE_LOADED_OBJECTS=1。 / Z g- ]9 e6 J7 \
也就是说,LD_TRACE_LOADED_OBJECTS为必要环境变量,其他环境变量的设置是可选的。 ) c3 d+ A3 ?% m' w
其他的变量的设置与ldd命令选项的对应关系如下:
: t# V3 l2 s5 s; f& T# T- -d, --data-relocs -> LD_WARN=yes
: _1 j9 q( Y0 y, l - -r, --function-relocs ->LD_WARN和LD_BIND_NOW=yes
9 A) g1 j" }$ S' }8 z - -u, --unused -> LD_DEBUG="unused"9 q, b( \* y. x: c
- -v, --verbose -> LD_VERBOSE=yes
复制代码比如设置LD_TRACE_LOADED_OBJECTS环境变量不为空时,任何可执行程序在运行时,都会只显示依赖的动态库,程序并不真正地执行。
; j4 b$ \ {& @$ U4 E3 g
测试如下: - 0 R$ l5 L d) ^! ]$ z
- export LD_TRACE_LOADED_OBJECTS=12 ~+ a$ W* t" r: A2 D
- ls
: b; m0 ~) E! R, i) g8 u ~, B - linux-vdso.so.1 => (0x00007ffd1d3cf000)
6 n* z1 f% D, { - /$LIB/libonion.so => /lib64/libonion.so (0x00007fbbe7162000)
6 H7 v2 c) l2 ^0 a% O - libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fbbe6e2e000): s/ A2 f8 F& O/ _0 C5 L
- libcap.so.2 => /lib64/libcap.so.2 (0x00007fbbe6c29000)/ v$ A$ Z4 G2 k* ]7 |2 ~9 j
- libacl.so.1 => /lib64/libacl.so.1 (0x00007fbbe6a20000)
1 ?8 [# h0 g+ [: g& V+ N! S3 k - libc.so.6 => /lib64/libc.so.6 (0x00007fbbe665e000)
8 b% O" r6 y2 w" f) x - libdl.so.2 => /lib64/libdl.so.2 (0x00007fbbe645a000)
& ~* q& S6 V: b - libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fbbe623e000)
6 q) m8 r% o9 m" ?+ R+ X - libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fbbe5fdd000)# ^& h: D% ~0 w" A L% o
- liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fbbe5db8000)* |9 Y J' U9 ^
- /lib64/ld-linux-x86-64.so.2 (0x00007fbbe7053000). x% `7 e: w! O' ?& Q# l/ X) h7 T, A) i
- libattr.so.1 => /lib64/libattr.so.1 (0x00007fbbe5bb3000)
复制代码撤销该环境变量,ls 即可恢复正常使用:
; U5 q5 }& o( e. P6 V/ I) o0 a" x* e- unset LD_TRACE_LOADED_OBJECTS" ^* c- e' g: B! X
- ls
# ?2 s+ b) J g9 g, _9 p% x - Changelog Changelog.ln dablelv txt.txt
复制代码由此可见,ldd 命令其实是通过设置 ld-linux.so 依赖的环境变量来影响 ld-linux.so的工作方式,使得可执行模块加载时显示其依赖的动态库。
7 T' M+ E* [: k
实际上可以直接执行 ld-linux.so 模块,如/lib/ld-linux.so.2 --list program,来达到命令ldd program的效果。
$ T3 @, U7 T9 V8 \ 2.命令格式
( x, [; M' T' T- ldd [OPTIONS] <FILES>
复制代码 ! J4 f2 @. g. w+ h- A% F* k& {8 i
其中[OPTIONS]为可选的命令选项,...为必填的程序或者共享库文件列表。 * I, y; b# S+ _$ O! Y
3.选项说明! P% \3 V8 ]* h# l
, J9 Q. x; T" j; O+ C1 G$ g- --version:打印ldd版本号: N3 W# a; h& r9 p0 S
- -v, --verbose:详细信息模式,打印所有相关信息: t( t7 t! o' h6 d- ~3 @. ~3 t
- -u, --unused:打印未使用的直接依赖* u. G: p/ L; O2 X8 h
- -d, --data-relocs:执行重定位和报告任何丢失的对象
6 R+ W- V0 s @/ l4 f' E - -r, --function-relocs:执行数据对象和函数的重定位,并且报告任何丢失的对象和函数。(只对ELF格式文件有效)
8 p0 p# q K: T5 u* U - --help:显示帮助信息
复制代码 4.示例说明(1)显示可执行文件依赖的动态链接库。
5 _/ u1 G; p- i- ldd /usr/bin/ls
* R& E- A3 e9 z: t) \& K. M - linux-vdso.so.1 => (0x00007ffd90514000)
4 \& N8 O+ r+ T, O - /$LIB/libonion.so => /lib64/libonion.so (0x00007f294ade8000)
' \8 |5 t" K W1 z B* M3 G9 E% e9 y+ S! y - libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f294aab4000)+ R+ f, B. ?+ c m! v( y
- libcap.so.2 => /lib64/libcap.so.2 (0x00007f294a8af000)6 ]& |6 L: S' S- Q, q f4 N
- libacl.so.1 => /lib64/libacl.so.1 (0x00007f294a6a6000), c9 P, z4 T B* V& T
- libc.so.6 => /lib64/libc.so.6 (0x00007f294a2e4000)
/ `/ m/ B/ G- m9 f - libdl.so.2 => /lib64/libdl.so.2 (0x00007f294a0e0000)
7 e8 u7 j3 n& B2 ~4 f& M9 A! f - libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2949ec4000)
* Q2 ~* _, x. o( H$ Y; s5 b - libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f2949c63000)5 \, Z F' F9 L: ]0 U8 ]
- liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f2949a3e000)
6 v& F9 e# t% t4 `: ^* ?' i( g: Y - /lib64/ld-linux-x86-64.so.2 (0x00007f294acd9000)
/ S8 N1 v6 J6 T% L2 P - libattr.so.1 => /lib64/libattr.so.1 (0x00007f2949839000)
复制代码 8 O1 S3 s' b5 j
" ?6 n3 T# A/ J4 b9 M
|