确定Linux二进制文件的直接共享对象依赖关系?


Answers:


261

您可以readelf用来浏览ELF标头。readelf -d将直接依赖项列为NEEDED部分。

 $ readelf -d elfbin

Dynamic section at offset 0xe30 contains 22 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libssl.so.1.0.0]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000c (INIT)               0x400520
 0x000000000000000d (FINI)               0x400758
 ...

20
这很棒。与ldd不同,readelf可以检查跨平台的二进制文件(即,检查来自x86-64 linux的ARM可执行文件。)
Robert Calhoun

86

如果要递归查找依赖关系(包括依赖关系的依赖关系,依赖关系的依赖关系等等)…

您可以使用ldd命令。 ldd-打印共享库依赖项


5
ldd命令计算出依赖关系的依赖关系,这不是我想要的。
免费角马

11
对我来说,这很好。它甚至告诉您,哪些图书馆可以找到,哪些找不到。
菲利普·F

2
ldd不适用于可执行文件-仅用于找出共享库的依赖项,这很有用。
Tuxdude 2012年

2
Tuxdude,您为什么这么认为?ldd无法用于ELF可执行文件的原因是什么?
维塔利·伊萨耶夫

对于将必需的共享库从开发机复制到部署档案库,这真是太棒了。
托马什Zato -恢复莫妮卡

30

objdump工具可以告诉您此信息。如果您objdump使用-x选项,要使其输出所有标头,则可以在“动态部分”的开头找到共享对象的依赖关系。

例如,objdump -x /usr/lib/libXpm.so.4在我的系统上运行,“动态部分”中提供以下信息:

Dynamic Section:
  NEEDED               libX11.so.6
  NEEDED               libc.so.6
  SONAME               libXpm.so.4
  INIT                 0x0000000000002450
  FINI                 0x000000000000e0e8
  GNU_HASH             0x00000000000001f0
  STRTAB               0x00000000000011a8
  SYMTAB               0x0000000000000470
  STRSZ                0x0000000000000813
  SYMENT               0x0000000000000018
  PLTGOT               0x000000000020ffe8
  PLTRELSZ             0x00000000000005e8
  PLTREL               0x0000000000000007
  JMPREL               0x0000000000001e68
  RELA                 0x0000000000001b38
  RELASZ               0x0000000000000330
  RELAENT              0x0000000000000018
  VERNEED              0x0000000000001ad8
  VERNEEDNUM           0x0000000000000001
  VERSYM               0x00000000000019bc
  RELACOUNT            0x000000000000001b

直接共享对象的依赖关系列为“ NEEDED”值。因此,在上面的示例中,libXpm.so.4在我的系统上只需要libX11.so.6libc.so.6

重要的是要注意,这并不意味着要传递给二进制文件的所有符号objdump都将出现在库中,但是它至少表明了加载器在加载二进制文件时将尝试加载的库。


13

ldd -v在“版本信息:”部分下打印依赖关系树。该部分的第一个块是二进制文件的直接依赖关系。

参见层次ldd(1)


和之间有什么区别objdump -x <binary> | grep "NEEDED"?我的意思是,两者几乎完全相同,而只是我得到的.so文件ldd多于objdump。但是结果并不相同的事实使我怀疑哪种方法更准确。
m4l490n
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.