Linux:ldd 查看程序依赖的共享库

3 篇文章 0 订阅

ldd不是一个可执行程序,只是一个shell脚本,如果程序执行时,依赖的某个库找不到,通过这个命令可以迅速定位问题所在。

一 命令格式

ldd 用于打印程序或者库文件的依赖库关系。

bingsanlang@ubuntu:~$ ldd --help
Usage: ldd [OPTION]... FILE...
      --help              print this help and exit //打印帮助
      --version           print version information and exit // 查看指令版本信息
  -d, --data-relocs       process data relocations //执行重定位和报告任何丢失的对象;
  -r, --function-relocs   process data and function relocations //执行数据对象和函数的重定位,并且报告任何丢失的对象和函数;
  -u, --unused            print unused direct dependencies // 打印未直接使用的依赖
  -v, --verbose           print all information //详细信息模式,打印所有相关信息;

For bug reporting instructions, please see:
<https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs>.

ldd能够显示可执行模块的dependency,其原理是通过设置一系列的环境变量,如下:LD_TRACE_LOADED_OBJECTS、LD_WARN、LD_BIND_NOW、LD_LIBRARY_VERSION、LD_VERBOSE等。
当LD_TRACE_LOADED_OBJECTS环境变量不为空时,任何可执行程序在运行时,它都会只显示模块的dependency,而程序并不真正执行。要不你可以在shell终端测试一下,如下:

export LD_TRACE_LOADED_OBJECTS=1

再执行任何的程序,如ls等,看看程序的运行结果。
ldd显示可执行模块的dependency的工作原理,其实质是通过ld-linux.so(elf动态库的装载器)来实现的。我们知道,ld-linux.so模块会先于executable模块程序工作,并获得控制权,因此当上述的那些环境变量被设置时,ld-linux.so选择了显示可执行模块的dependency。

实际上可以直接执行ld-linux.so模块,如:/lib/ld-linux.so.2 --list program(这相当于ldd program)

二、示例

bingsanlang@ubuntu:~$ ldd ./main
	linux-vdso.so.1 =>  (0x00007fffb5f17000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fec28aeb000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fec28eb5000)

其中信息解释如下:

  • 第一列显示需要的类库。
  • 第二列显示实际提供的类库。
  • 第三列显示提供类库的开始地址空间
bingsanlang@ubuntu:~$ ldd -d ./main
	linux-vdso.so.1 =>  (0x00007ffc73db
	c000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f550a9b5000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f550ad7f000)
bingsanlang@ubuntu:~$ ldd -r ./main
	linux-vdso.so.1 =>  (0x00007ffdb5f79000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdb32a94000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fdb32e5e000)
bingsanlang@ubuntu:~$ ldd -u ./main
Unused direct dependencies:
	/lib/x86_64-linux-gnu/libc.so.6
bingsanlang@ubuntu:~$ ldd -v ./main
	linux-vdso.so.1 =>  (0x00007ffd98f84000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f95bf551000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f95bf91b000)

	Version information:
	./main:
		libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
	/lib/x86_64-linux-gnu/libc.so.6:
		ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
		ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
bingsanlang@ubuntu:~$ ldd --version
ldd (Ubuntu GLIBC 2.23-0ubuntu11.2) 2.23
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

参考:
https://man.linuxde.net/ldd
https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/ldd.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值