我怎样才能轻松地找出 ELF 格式的 Linux 二进制文件的直接共享对象依赖关系?
我知道 ldd 工具,但它似乎输出二进制文件的所有依赖项,包括二进制文件所依赖的任何共享对象的依赖项。
objdump工具可以告诉您这些信息。如果您使用 -x选项调用 objdump,使其输出所有头,那么您将在“ Dynamic Section”的开始部分找到共享对象依赖项。
objdump
-x
例如,在我的系统上运行 objdump -x /usr/lib/libXpm.so.4会在“动态部分”中给出以下信息:
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.6和 libc.so.6。
libXpm.so.4
libX11.so.6
libc.so.6
需要注意的是,这并不意味着传递给 objdump的二进制文件所需要的所有符号都会出现在库中,但它至少显示了加载程序在加载二进制文件时将尝试加载哪些库。
您可以使用 readelf来查看 ELF 头。 readelf -d将直接依赖项列为 NEEDED节。
readelf
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
Ldd-v 在“ Version information:”部分打印依赖树。该部分中的第一个块是二进制文件的直接依赖项。
参见 分层 ldd (1)