如何findLinux(ELF)二进制文件的直接共享对象依赖关系?

我如何轻松findLinux二进制文件(ELF格式)的直接共享对象依赖关系?

我知道ldd工具,但似乎输出二进制文件的所有依赖关系,包括二进制文件依赖的任何共享对象的依赖关系。

您可以使用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 ... 

如果你想recursion地find依赖关系(包括依赖依赖关系,依赖关系依赖关系等等)…

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

objdump工具可以告诉你这些信息。 如果使用-x选项调用objdump,要使其输出所有头文件,那么您将在“dynamic部分”的开始位置find共享对象相关性。

例如,在我的系统上运行'objdump -x /usr/lib/libXpm.so.4'在“dynamic部分”中给出了以下信息:

 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 

直接共享对象依赖项被列为“需要”值。 所以在上面的例子中,我的系统上的libXpm.so.4只需要libX11.so.6和libc.so.6。

需要注意的是,这并不意味着传递给objdump的二进制文件所需要的所有符号都将出现在库中,但是它至less会显示加载器在加载二进制文件时会加载哪些库。

ldd -v在“Version information:”部分打印依赖关系树,该部分的第一个块是二进制的直接依赖关系。

请参阅分层ldd(1)