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

我怎样才能轻松地找出 ELF 格式的 Linux 二进制文件的直接共享对象依赖关系?

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

199304 次浏览

objdump工具可以告诉您这些信息。如果您使用 -x选项调用 objdump,使其输出所有头,那么您将在“ Dynamic Section”的开始部分找到共享对象依赖项。

例如,在我的系统上运行 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的二进制文件所需要的所有符号都会出现在库中,但它至少显示了加载程序在加载二进制文件时将尝试加载哪些库。

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

如果您想找到依赖关系 递归(包括依赖关系的依赖关系,依赖关系的依赖关系等等) ..。

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

Ldd-v 在“ Version information:”部分打印依赖树。该部分中的第一个块是二进制文件的直接依赖项。

参见 分层 ldd (1)