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

Linux 命令: ldd 命令

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

0 D+ a, F6 @3 j& k; o
注意,ldd 本身不是一个二进制程序,而是一个 Shell 脚本,使用文本编辑器 vim 可以查看其内容,具体目录可以使用 which 命令查看:
  1. % l/ H3 v1 L0 u" U4 W* @
  2. which ldd
    1 k5 _/ T; n0 j
  3. /usr/bin/ldd
复制代码
我们知道,Linux 的动态库装载器 ld-linux.so 模块会先于 executable 模块工作,并获得控制权,ld-linux.so 会通过系统环境变量的设置,选择只显示可执行模块的dependency,而不运行可执行模块。
7 U6 Z- e% y' Z% ?. ~6 D
相关环境变量有:

  1. % f+ [9 j8 Y1 d9 e
  2. LD_TRACE_LOADED_OBJECTS8 m. V7 P" c% n1 w' {6 Z6 s/ `
  3. LD_WARN' o6 Q0 K- R7 {6 z7 `4 z# d2 E
  4. LD_BIND_NOW
    3 o9 X8 W* E: n3 u
  5. LD_LIBRARY_VERSION
    7 n; j, ?& O) g9 Z, a/ z/ V  k
  6. LD_VERBOSE
    ! {: H6 j' b; o6 n2 k& w4 r
  7. LD_DEBUG
复制代码
ldd 默认开启的环境变量是:LD_TRACE_LOADED_OBJECTS=1。

" {9 K7 p' ]: V+ Z% f1 e$ G
也就是说,LD_TRACE_LOADED_OBJECTS为必要环境变量,其他环境变量的设置是可选的。
5 j5 Q/ Z1 F) a- _
其他的变量的设置与ldd命令选项的对应关系如下:
  1. 8 r" t- g: M4 k" }# j8 m8 C) H
  2. -d, --data-relocs -> LD_WARN=yes9 f  Y! x, L- P# y  |
  3. -r, --function-relocs ->LD_WARN和LD_BIND_NOW=yes9 g. o% @6 w" |: L2 U
  4. -u, --unused -> LD_DEBUG="unused"( y* {5 Q9 g* }
  5. -v, --verbose -> LD_VERBOSE=yes
复制代码
比如设置LD_TRACE_LOADED_OBJECTS环境变量不为空时,任何可执行程序在运行时,都会只显示依赖的动态库,程序并不真正地执行。
4 G( f- W+ _# K$ h: b. o1 _- F# ]
测试如下:
  1. 8 S1 C7 L4 m# R# M8 a* g+ _5 K- B' w
  2. export LD_TRACE_LOADED_OBJECTS=1
    ) i! ~, E/ G. F9 A
  3. ls
    ! V: f$ A; ?# ]% s
  4.   linux-vdso.so.1 =>  (0x00007ffd1d3cf000)
    * A; v3 ?3 m- `: ~, x$ o
  5.   /$LIB/libonion.so => /lib64/libonion.so (0x00007fbbe7162000)* x3 K) {8 Z6 Q& b
  6.   libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fbbe6e2e000)2 i  K' q6 T+ n) ~
  7.   libcap.so.2 => /lib64/libcap.so.2 (0x00007fbbe6c29000)
    - W! r$ X; T  D/ z7 i
  8.   libacl.so.1 => /lib64/libacl.so.1 (0x00007fbbe6a20000)$ [+ X6 z5 y( x. a$ E+ `6 N) C
  9.   libc.so.6 => /lib64/libc.so.6 (0x00007fbbe665e000)0 M- e& B% f7 f% H" l% j
  10.   libdl.so.2 => /lib64/libdl.so.2 (0x00007fbbe645a000)& i' Y& _! Y2 Y0 w  H
  11.   libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fbbe623e000)% ^9 a0 t+ ~$ h$ O' j
  12.   libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fbbe5fdd000)! L* f2 F3 C0 Y/ C
  13.   liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fbbe5db8000)
      {$ q! K1 `) E) n/ t4 a
  14.   /lib64/ld-linux-x86-64.so.2 (0x00007fbbe7053000)7 Q) q  j' L: c* J/ q2 G: r
  15.   libattr.so.1 => /lib64/libattr.so.1 (0x00007fbbe5bb3000)
复制代码
撤销该环境变量,ls 即可恢复正常使用:

  1. 1 ?6 h  F$ [$ r% m) H" V2 R7 m
  2. unset LD_TRACE_LOADED_OBJECTS
    - O1 k9 h6 `  q, I4 z7 c* x9 \$ e0 f
  3. ls
    - P' ^& f2 o  s: ]/ n1 n: c
  4. Changelog  Changelog.ln  dablelv  txt.txt
复制代码
由此可见,ldd 命令其实是通过设置 ld-linux.so 依赖的环境变量来影响 ld-linux.so的工作方式,使得可执行模块加载时显示其依赖的动态库。

9 Q% t3 M% o4 V' b( n
实际上可以直接执行 ld-linux.so 模块,如/lib/ld-linux.so.2 --list program,来达到命令ldd program的效果。

+ u8 q5 u. y' w0 O. r
2.命令格式
  1. . ?4 F( G: N/ U; Z2 p# d  N
  2. ldd [OPTIONS] <FILES>
复制代码
. n$ p! {! J. ], [' g8 Q
其中[OPTIONS]为可选的命令选项,...为必填的程序或者共享库文件列表。
7 B4 I+ E) B8 o. {( z; T, F
3.选项说明. W& ?# K' Z/ |6 f0 U

  1. " V! g# t1 z0 I: q
  2. --version:打印ldd版本号& q3 h, l, l: i& e# G
  3. -v, --verbose:详细信息模式,打印所有相关信息8 E, L2 z' ~0 J8 c" w3 `* @
  4. -u, --unused:打印未使用的直接依赖7 I" [- m$ y8 k  j: `
  5. -d, --data-relocs:执行重定位和报告任何丢失的对象$ x5 {, p% t& P$ q9 r; q
  6. -r, --function-relocs:执行数据对象和函数的重定位,并且报告任何丢失的对象和函数。(只对ELF格式文件有效)8 g& V) g( q1 ]1 o7 R  S  N6 K
  7. --help:显示帮助信息
复制代码
4.示例说明
(1)显示可执行文件依赖的动态链接库。

  1. 4 t5 Y* H9 M5 O: m* [/ `( y
  2. ldd /usr/bin/ls4 t3 _2 x: }4 T2 W% F& P
  3.   linux-vdso.so.1 =>  (0x00007ffd90514000)
    4 d% U! F5 i: V" r& _/ _
  4.   /$LIB/libonion.so => /lib64/libonion.so (0x00007f294ade8000)
    " }' z$ v. b! {* \& U
  5.   libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f294aab4000)
    9 U/ f& A) S- ]
  6.   libcap.so.2 => /lib64/libcap.so.2 (0x00007f294a8af000)
    9 N, I$ L8 T1 ]$ d1 q  T2 C
  7.   libacl.so.1 => /lib64/libacl.so.1 (0x00007f294a6a6000)
    0 N( a3 T( w0 @- t- C6 m1 X( q
  8.   libc.so.6 => /lib64/libc.so.6 (0x00007f294a2e4000)7 K, E& O3 `- q2 D) n0 L
  9.   libdl.so.2 => /lib64/libdl.so.2 (0x00007f294a0e0000)) N+ Q: e- e2 g) F+ c. u' A
  10.   libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2949ec4000)
    " O+ `: c2 u5 n$ l, [
  11.   libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f2949c63000)
    0 `& h3 e$ z% f. Y+ E
  12.   liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f2949a3e000)* S4 `) o8 H( p7 i
  13.   /lib64/ld-linux-x86-64.so.2 (0x00007f294acd9000)
    ( M: V2 d4 D: e1 Y& q
  14.   libattr.so.1 => /lib64/libattr.so.1 (0x00007f2949839000)
复制代码
' ^: R  G4 b) U* B
4 y) }8 @  s9 D7 c
赞 收藏 评论0 发布时间:2021-2-25 12:36

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版