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

Linux 命令: ldd 命令

[复制链接]
gaosmile 发布时间:2021-2-25 12:36
1.命令简介
ldd 命令用于打印程序或者共享库文件所依赖的共享库列表。

/ e* w6 g  i2 _" M& X
注意,ldd 本身不是一个二进制程序,而是一个 Shell 脚本,使用文本编辑器 vim 可以查看其内容,具体目录可以使用 which 命令查看:
  1. 9 Q) ]0 y" h0 M0 o( l
  2. which ldd! z: I2 F5 O# m: M$ A# t) V, X# c5 K
  3. /usr/bin/ldd
复制代码
我们知道,Linux 的动态库装载器 ld-linux.so 模块会先于 executable 模块工作,并获得控制权,ld-linux.so 会通过系统环境变量的设置,选择只显示可执行模块的dependency,而不运行可执行模块。
: [" J+ O, e. M# v9 G; J
相关环境变量有:

  1. * Y2 M/ H% N& y' E* D9 ]
  2. LD_TRACE_LOADED_OBJECTS* K5 i* _' Y: E( t9 L
  3. LD_WARN; H& o& f2 x# J% x/ @2 M
  4. LD_BIND_NOW- \8 L& z# n  Y- C
  5. LD_LIBRARY_VERSION$ N- B1 h  c, G9 u9 p: A) g- e
  6. LD_VERBOSE+ n' x) @. _3 u/ f
  7. 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命令选项的对应关系如下:
  1. / E( d9 \, m# }+ U
  2. -d, --data-relocs -> LD_WARN=yes9 y" D0 R/ v$ w( c
  3. -r, --function-relocs ->LD_WARN和LD_BIND_NOW=yes, C& M4 P9 Q4 J0 ?: S2 D
  4. -u, --unused -> LD_DEBUG="unused"
    4 V) R" V, J  e8 ?1 f2 K8 o
  5. -v, --verbose -> LD_VERBOSE=yes
复制代码
比如设置LD_TRACE_LOADED_OBJECTS环境变量不为空时,任何可执行程序在运行时,都会只显示依赖的动态库,程序并不真正地执行。
  Q8 G( q$ Y& l# o5 _- S
测试如下:
  1. , b; Y  y* k3 P1 I) i
  2. export LD_TRACE_LOADED_OBJECTS=1
    7 @) V6 n5 y' m  D
  3. ls! n: r7 g  n/ g* ?8 R6 _8 ^: L
  4.   linux-vdso.so.1 =>  (0x00007ffd1d3cf000)
    * D. h/ z$ z2 U
  5.   /$LIB/libonion.so => /lib64/libonion.so (0x00007fbbe7162000)
    - h1 H% v- t  N- p' W7 J9 T6 P
  6.   libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fbbe6e2e000)
    ) C! B5 J7 E2 [2 T* k9 g& K5 Y1 P# l9 h$ K
  7.   libcap.so.2 => /lib64/libcap.so.2 (0x00007fbbe6c29000)( n5 @$ _7 \. }+ J4 r1 p$ F% J
  8.   libacl.so.1 => /lib64/libacl.so.1 (0x00007fbbe6a20000): Y0 `( k0 V) `( b0 X. m" ~* c0 V/ c
  9.   libc.so.6 => /lib64/libc.so.6 (0x00007fbbe665e000)
    + h3 f/ }( G7 y4 i& c; g: ~' A3 w
  10.   libdl.so.2 => /lib64/libdl.so.2 (0x00007fbbe645a000)
    & Y2 K  R2 x7 N' P9 A0 E2 E6 `
  11.   libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fbbe623e000)
    * d3 s- k/ c2 v
  12.   libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fbbe5fdd000)
    2 B2 E# C' W3 L6 {. x
  13.   liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fbbe5db8000)
    ) H. x( R! {) Z
  14.   /lib64/ld-linux-x86-64.so.2 (0x00007fbbe7053000)$ }9 |" y1 q1 {- c# S, k# P+ a
  15.   libattr.so.1 => /lib64/libattr.so.1 (0x00007fbbe5bb3000)
复制代码
撤销该环境变量,ls 即可恢复正常使用:

  1. : M( X" V5 x9 y# M* {- E5 x
  2. unset LD_TRACE_LOADED_OBJECTS
    8 _% Z/ L9 K( |& c$ l
  3. ls8 m: f$ g- B0 y. m  h1 ?
  4. 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.命令格式

  1. 5 H0 `: q  A2 N7 C( L
  2. ldd [OPTIONS] <FILES>
复制代码

1 e* n- B5 [: t. C9 h( g) N4 ]
其中[OPTIONS]为可选的命令选项,...为必填的程序或者共享库文件列表。

! D+ p/ S" F+ _$ r+ i# V" u
3.选项说明. h# q9 z- n6 j5 ]7 Q
  1. ; l1 `" x, K. ]$ u- F1 e
  2. --version:打印ldd版本号3 Z' M8 P5 j/ A  B  w1 j& W
  3. -v, --verbose:详细信息模式,打印所有相关信息) b- \$ X, k5 _, D* `4 ]8 e: B
  4. -u, --unused:打印未使用的直接依赖
    7 a7 Q& W8 Y5 e* R; V; G
  5. -d, --data-relocs:执行重定位和报告任何丢失的对象+ y7 ?. ~' ]: ~& G; C# C8 y
  6. -r, --function-relocs:执行数据对象和函数的重定位,并且报告任何丢失的对象和函数。(只对ELF格式文件有效)% D# X' m, C* b
  7. --help:显示帮助信息
复制代码
4.示例说明
(1)显示可执行文件依赖的动态链接库。
  1. 9 b7 ^( O" Q+ V9 g$ t
  2. ldd /usr/bin/ls- t( H* T0 I4 R; X( E
  3.   linux-vdso.so.1 =>  (0x00007ffd90514000)
    1 {( A) P, i3 ~8 d7 M# c* a/ y5 d" F
  4.   /$LIB/libonion.so => /lib64/libonion.so (0x00007f294ade8000)
    ! ~1 p5 m) J; |1 i
  5.   libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f294aab4000)5 L" X  w) z$ a0 I- k& U1 j
  6.   libcap.so.2 => /lib64/libcap.so.2 (0x00007f294a8af000)7 Q0 G2 V* U, e7 x
  7.   libacl.so.1 => /lib64/libacl.so.1 (0x00007f294a6a6000)1 n5 `% M, j3 _$ @9 C
  8.   libc.so.6 => /lib64/libc.so.6 (0x00007f294a2e4000)
    , g0 L% j# ~; s9 H$ H6 z5 w* x4 B1 q
  9.   libdl.so.2 => /lib64/libdl.so.2 (0x00007f294a0e0000)* ]! B; ~1 v5 B  h, D
  10.   libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2949ec4000)
    8 q+ c' ]! f0 D6 f& A* {+ d
  11.   libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f2949c63000), [# v- c; |0 X$ U* d# f
  12.   liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f2949a3e000)
    - h% D2 r9 h; o) s9 W+ x
  13.   /lib64/ld-linux-x86-64.so.2 (0x00007f294acd9000)
    . P4 S' U9 w" g' Z
  14.   libattr.so.1 => /lib64/libattr.so.1 (0x00007f2949839000)
复制代码

; K' F/ E: D+ _' C* X# U7 o3 l( D: ~, V$ o$ e+ x8 H
收藏 评论0 发布时间:2021-2-25 12:36

举报

0个回答

所属标签

相似分享

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