你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Linux 命令: ldd 命令

[复制链接]
gaosmile 发布时间:2021-2-25 12:36
1.命令简介
ldd 命令用于打印程序或者共享库文件所依赖的共享库列表。
6 |- ]. h' P/ z4 G1 Q: l
注意,ldd 本身不是一个二进制程序,而是一个 Shell 脚本,使用文本编辑器 vim 可以查看其内容,具体目录可以使用 which 命令查看:
  1. ' n7 d9 U4 _: R* u
  2. which ldd
    , H# Z6 u9 ]6 H1 R# A& C  P
  3. /usr/bin/ldd
复制代码
我们知道,Linux 的动态库装载器 ld-linux.so 模块会先于 executable 模块工作,并获得控制权,ld-linux.so 会通过系统环境变量的设置,选择只显示可执行模块的dependency,而不运行可执行模块。

: ]  q3 ]# _7 i0 r# r2 x
相关环境变量有:
  1. . A/ J' B3 R2 I8 ?: G8 g( \
  2. LD_TRACE_LOADED_OBJECTS
    6 i( v5 C5 h; Y# m2 L
  3. LD_WARN
    $ `" A/ Q  K5 U2 @
  4. LD_BIND_NOW
    9 r/ s7 D9 p# ]' y8 C
  5. LD_LIBRARY_VERSION2 i5 E4 D& G, s( K- f  {
  6. LD_VERBOSE
    # o9 t3 ?$ |7 V2 o
  7. LD_DEBUG
复制代码
ldd 默认开启的环境变量是:LD_TRACE_LOADED_OBJECTS=1。

4 x* \# v0 Y5 S0 w! q
也就是说,LD_TRACE_LOADED_OBJECTS为必要环境变量,其他环境变量的设置是可选的。

: b7 `- c+ o  y$ ]- R- ]
其他的变量的设置与ldd命令选项的对应关系如下:
  1. ! B& i- m6 n- q0 Z; g  f5 y& z7 u
  2. -d, --data-relocs -> LD_WARN=yes4 Y5 D" j3 `" Q  y2 a& P4 }
  3. -r, --function-relocs ->LD_WARN和LD_BIND_NOW=yes
    # A/ @$ ]& {! p$ m$ V
  4. -u, --unused -> LD_DEBUG="unused"
    / Z7 l  G5 S- R% Z& ~9 |* m8 a
  5. -v, --verbose -> LD_VERBOSE=yes
复制代码
比如设置LD_TRACE_LOADED_OBJECTS环境变量不为空时,任何可执行程序在运行时,都会只显示依赖的动态库,程序并不真正地执行。

% Y+ j: C6 V# i* M. `" i" g
测试如下:

  1. 9 {9 _+ B. w' Y# l/ J
  2. export LD_TRACE_LOADED_OBJECTS=10 F; Z' n6 }$ h% y3 p9 n
  3. ls+ v  B5 m) g; t+ D
  4.   linux-vdso.so.1 =>  (0x00007ffd1d3cf000)
    5 ?# f2 ~" B. n3 e  i$ o' I* N
  5.   /$LIB/libonion.so => /lib64/libonion.so (0x00007fbbe7162000)
    6 g. h8 C: H, R% o) t" F- }
  6.   libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fbbe6e2e000)3 \6 V% _1 s* w
  7.   libcap.so.2 => /lib64/libcap.so.2 (0x00007fbbe6c29000)
    - {) V0 Z6 p2 n  ?* d( l
  8.   libacl.so.1 => /lib64/libacl.so.1 (0x00007fbbe6a20000)4 K1 y) M) x0 v. b& Y# b
  9.   libc.so.6 => /lib64/libc.so.6 (0x00007fbbe665e000)
    8 Y0 G3 s- q* {
  10.   libdl.so.2 => /lib64/libdl.so.2 (0x00007fbbe645a000), U1 y4 q  @# Z1 `. a
  11.   libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fbbe623e000)2 ~& D5 ~' A' E' r7 P0 N3 l
  12.   libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fbbe5fdd000)
    6 r: H; d8 }) C4 b' |
  13.   liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fbbe5db8000)
    , q* Q6 F* Z2 i" S) m0 d
  14.   /lib64/ld-linux-x86-64.so.2 (0x00007fbbe7053000)# n9 q) {7 @. _4 Z& z
  15.   libattr.so.1 => /lib64/libattr.so.1 (0x00007fbbe5bb3000)
复制代码
撤销该环境变量,ls 即可恢复正常使用:
  1. ; e* e, k4 P- O3 M7 M8 v
  2. unset LD_TRACE_LOADED_OBJECTS
    0 O4 H8 z. W4 Z2 m6 V) H6 W
  3. ls# \: R; g* l, r/ g9 ?
  4. Changelog  Changelog.ln  dablelv  txt.txt
复制代码
由此可见,ldd 命令其实是通过设置 ld-linux.so 依赖的环境变量来影响 ld-linux.so的工作方式,使得可执行模块加载时显示其依赖的动态库。

" t" C/ y6 B  y2 p$ d
实际上可以直接执行 ld-linux.so 模块,如/lib/ld-linux.so.2 --list program,来达到命令ldd program的效果。
' F1 _" ?+ ]' |; B' h5 ~, i2 I& J
2.命令格式
  1. " z" n3 c# u: Q* L6 p2 H( M
  2. ldd [OPTIONS] <FILES>
复制代码

/ q* C$ F' C$ |" y# L/ o
其中[OPTIONS]为可选的命令选项,...为必填的程序或者共享库文件列表。

$ g# q- i+ x: \
3.选项说明
& k: V/ v! b* r/ C

  1. $ f5 e% \3 O* `! c
  2. --version:打印ldd版本号) d  J, e9 c! _6 r
  3. -v, --verbose:详细信息模式,打印所有相关信息
    8 Z) O' B- A1 b$ c
  4. -u, --unused:打印未使用的直接依赖6 s! h) z; ^0 @! ^1 n9 Y
  5. -d, --data-relocs:执行重定位和报告任何丢失的对象5 M3 }5 f6 l5 g1 ]; ^: l& ]0 t
  6. -r, --function-relocs:执行数据对象和函数的重定位,并且报告任何丢失的对象和函数。(只对ELF格式文件有效)7 h1 J' l! _9 [1 y
  7. --help:显示帮助信息
复制代码
4.示例说明
(1)显示可执行文件依赖的动态链接库。

  1. - P# w1 i$ K' p1 b
  2. ldd /usr/bin/ls6 R8 f5 b2 e4 Q2 o( G! k
  3.   linux-vdso.so.1 =>  (0x00007ffd90514000)9 Q2 Z' j( Z: I) R% W
  4.   /$LIB/libonion.so => /lib64/libonion.so (0x00007f294ade8000)
    , C  W: T$ @& v  [+ V" g
  5.   libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f294aab4000)# [8 U  @  x# h& m+ P+ z! E
  6.   libcap.so.2 => /lib64/libcap.so.2 (0x00007f294a8af000). a* }, K, x3 D) A( ^
  7.   libacl.so.1 => /lib64/libacl.so.1 (0x00007f294a6a6000)2 B3 U4 I) U3 Q( R) {
  8.   libc.so.6 => /lib64/libc.so.6 (0x00007f294a2e4000)% s/ f' c; H3 l" m
  9.   libdl.so.2 => /lib64/libdl.so.2 (0x00007f294a0e0000)) F$ \! j; l) [0 M
  10.   libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2949ec4000)* Q7 e* t% M! `) G8 T! b5 u
  11.   libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f2949c63000)7 c) k+ j1 i$ W9 a7 t6 d$ E! V* o; X
  12.   liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f2949a3e000)0 Q7 C: I- ]( U6 z6 O/ X- H
  13.   /lib64/ld-linux-x86-64.so.2 (0x00007f294acd9000)
    ) k* O  G. n1 X: h" }
  14.   libattr.so.1 => /lib64/libattr.so.1 (0x00007f2949839000)
复制代码

+ s2 D9 O( z2 G, j  T* }1 t- f- G% I3 {! a' J3 @" Q8 h
收藏 评论0 发布时间:2021-2-25 12:36

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版