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

Linux 命令: ldd 命令

[复制链接]
gaosmile 发布时间:2021-2-25 12:36
1.命令简介
ldd 命令用于打印程序或者共享库文件所依赖的共享库列表。
" ^4 H1 c( Z" H. J
注意,ldd 本身不是一个二进制程序,而是一个 Shell 脚本,使用文本编辑器 vim 可以查看其内容,具体目录可以使用 which 命令查看:

  1. 8 r. W$ r  ~  _# j$ M9 O
  2. which ldd
    6 A* E1 `1 A% t
  3. /usr/bin/ldd
复制代码
我们知道,Linux 的动态库装载器 ld-linux.so 模块会先于 executable 模块工作,并获得控制权,ld-linux.so 会通过系统环境变量的设置,选择只显示可执行模块的dependency,而不运行可执行模块。

3 h7 @0 C* L0 ?! R$ f
相关环境变量有:

  1. . R8 A  }' J& w% ?
  2. LD_TRACE_LOADED_OBJECTS3 N/ j5 ?$ c) p2 n3 a
  3. LD_WARN' D- ^+ x9 w. Y6 H9 L- @
  4. LD_BIND_NOW9 ~( |7 Q& X0 q  T4 Q2 }7 e
  5. LD_LIBRARY_VERSION
      a$ l- `4 z4 j$ d) F, j
  6. LD_VERBOSE3 U8 ]7 Z. g5 \* T7 [- E
  7. LD_DEBUG
复制代码
ldd 默认开启的环境变量是:LD_TRACE_LOADED_OBJECTS=1。
/ Z  g- ]9 e6 J7 \
也就是说,LD_TRACE_LOADED_OBJECTS为必要环境变量,其他环境变量的设置是可选的。
) c3 d+ A3 ?% m' w
其他的变量的设置与ldd命令选项的对应关系如下:

  1. : t# V3 l2 s5 s; f& T# T
  2. -d, --data-relocs -> LD_WARN=yes
    : _1 j9 q( Y0 y, l
  3. -r, --function-relocs ->LD_WARN和LD_BIND_NOW=yes
    9 A) g1 j" }$ S' }8 z
  4. -u, --unused -> LD_DEBUG="unused"9 q, b( \* y. x: c
  5. -v, --verbose -> LD_VERBOSE=yes
复制代码
比如设置LD_TRACE_LOADED_OBJECTS环境变量不为空时,任何可执行程序在运行时,都会只显示依赖的动态库,程序并不真正地执行。

; j4 b$ \  {& @$ U4 E3 g
测试如下:
  1. 0 R$ l5 L  d) ^! ]$ z
  2. export LD_TRACE_LOADED_OBJECTS=12 ~+ a$ W* t" r: A2 D
  3. ls
    : b; m0 ~) E! R, i) g8 u  ~, B
  4.   linux-vdso.so.1 =>  (0x00007ffd1d3cf000)
    6 n* z1 f% D, {
  5.   /$LIB/libonion.so => /lib64/libonion.so (0x00007fbbe7162000)
    6 H7 v2 c) l2 ^0 a% O
  6.   libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fbbe6e2e000): s/ A2 f8 F& O/ _0 C5 L
  7.   libcap.so.2 => /lib64/libcap.so.2 (0x00007fbbe6c29000)/ v$ A$ Z4 G2 k* ]7 |2 ~9 j
  8.   libacl.so.1 => /lib64/libacl.so.1 (0x00007fbbe6a20000)
    1 ?8 [# h0 g+ [: g& V+ N! S3 k
  9.   libc.so.6 => /lib64/libc.so.6 (0x00007fbbe665e000)
    8 b% O" r6 y2 w" f) x
  10.   libdl.so.2 => /lib64/libdl.so.2 (0x00007fbbe645a000)
    & ~* q& S6 V: b
  11.   libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fbbe623e000)
    6 q) m8 r% o9 m" ?+ R+ X
  12.   libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fbbe5fdd000)# ^& h: D% ~0 w" A  L% o
  13.   liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fbbe5db8000)* |9 Y  J' U9 ^
  14.   /lib64/ld-linux-x86-64.so.2 (0x00007fbbe7053000). x% `7 e: w! O' ?& Q# l/ X) h7 T, A) i
  15.   libattr.so.1 => /lib64/libattr.so.1 (0x00007fbbe5bb3000)
复制代码
撤销该环境变量,ls 即可恢复正常使用:

  1. ; U5 q5 }& o( e. P6 V/ I) o0 a" x* e
  2. unset LD_TRACE_LOADED_OBJECTS" ^* c- e' g: B! X
  3. ls
    # ?2 s+ b) J  g9 g, _9 p% x
  4. 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.命令格式

  1. ( x, [; M' T' T
  2. 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

  1. , J9 Q. x; T" j; O+ C1 G$ g
  2. --version:打印ldd版本号: N3 W# a; h& r9 p0 S
  3. -v, --verbose:详细信息模式,打印所有相关信息: t( t7 t! o' h6 d- ~3 @. ~3 t
  4. -u, --unused:打印未使用的直接依赖* u. G: p/ L; O2 X8 h
  5. -d, --data-relocs:执行重定位和报告任何丢失的对象
    6 R+ W- V0 s  @/ l4 f' E
  6. -r, --function-relocs:执行数据对象和函数的重定位,并且报告任何丢失的对象和函数。(只对ELF格式文件有效)
    8 p0 p# q  K: T5 u* U
  7. --help:显示帮助信息
复制代码
4.示例说明
(1)显示可执行文件依赖的动态链接库。

  1. 5 _/ u1 G; p- i
  2. ldd /usr/bin/ls
    * R& E- A3 e9 z: t) \& K. M
  3.   linux-vdso.so.1 =>  (0x00007ffd90514000)
    4 \& N8 O+ r+ T, O
  4.   /$LIB/libonion.so => /lib64/libonion.so (0x00007f294ade8000)
    ' \8 |5 t" K  W1 z  B* M3 G9 E% e9 y+ S! y
  5.   libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f294aab4000)+ R+ f, B. ?+ c  m! v( y
  6.   libcap.so.2 => /lib64/libcap.so.2 (0x00007f294a8af000)6 ]& |6 L: S' S- Q, q  f4 N
  7.   libacl.so.1 => /lib64/libacl.so.1 (0x00007f294a6a6000), c9 P, z4 T  B* V& T
  8.   libc.so.6 => /lib64/libc.so.6 (0x00007f294a2e4000)
    / `/ m/ B/ G- m9 f
  9.   libdl.so.2 => /lib64/libdl.so.2 (0x00007f294a0e0000)
    7 e8 u7 j3 n& B2 ~4 f& M9 A! f
  10.   libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2949ec4000)
    * Q2 ~* _, x. o( H$ Y; s5 b
  11.   libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f2949c63000)5 \, Z  F' F9 L: ]0 U8 ]
  12.   liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f2949a3e000)
    6 v& F9 e# t% t4 `: ^* ?' i( g: Y
  13.   /lib64/ld-linux-x86-64.so.2 (0x00007f294acd9000)
    / S8 N1 v6 J6 T% L2 P
  14.   libattr.so.1 => /lib64/libattr.so.1 (0x00007f2949839000)
复制代码
8 O1 S3 s' b5 j
" ?6 n3 T# A/ J4 b9 M
收藏 评论0 发布时间:2021-2-25 12:36

举报

0个回答

所属标签

相似分享

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