我需要以编程方式检查给定可执行文件的库依赖关系。有比运行ldd (或objdump)命令和解析它们的输出更好的方法吗?是否有一个提供与ldd相同结果的API?
发布于 2020-03-23 02:40:42
我需要以编程方式检查给定可执行文件的库依赖关系。
我将假设您使用的是ELF系统(可能是Linux)。
可执行文件或共享库的动态库依赖项被编码为库的Elf{32_,64}_Dyn段中的PT_DYNAMIC条目或可执行文件中的表。ldd (间接地,但这是实现细节)解释这些条目,然后使用系统配置和/或LD_LIBRARY_PATH环境变量的各种细节来定位所需的库。
您可以使用PT_DYNAMIC打印readelf -d a.out的内容。例如:
$ readelf -d /bin/date
Dynamic section at offset 0x19df8 contains 26 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000c (INIT) 0x3000
0x000000000000000d (FINI) 0x12780
0x0000000000000019 (INIT_ARRAY) 0x1a250
0x000000000000001b (INIT_ARRAYSZ) 8 (bytes)
0x000000000000001a (FINI_ARRAY) 0x1a258
0x000000000000001c (FINI_ARRAYSZ) 8 (bytes)
0x000000006ffffef5 (GNU_HASH) 0x308
0x0000000000000005 (STRTAB) 0xb38
0x0000000000000006 (SYMTAB) 0x358
0x000000000000000a (STRSZ) 946 (bytes)
0x000000000000000b (SYMENT) 24 (bytes)
0x0000000000000015 (DEBUG) 0x0
0x0000000000000003 (PLTGOT) 0x1b000
0x0000000000000002 (PLTRELSZ) 1656 (bytes)
0x0000000000000014 (PLTREL) RELA
0x0000000000000017 (JMPREL) 0x2118
0x0000000000000007 (RELA) 0x1008
0x0000000000000008 (RELASZ) 4368 (bytes)
0x0000000000000009 (RELAENT) 24 (bytes)
0x000000006ffffffb (FLAGS_1) Flags: PIE
0x000000006ffffffe (VERNEED) 0xf98
0x000000006fffffff (VERNEEDNUM) 1
0x000000006ffffff0 (VERSYM) 0xeea
0x000000006ffffff9 (RELACOUNT) 170
0x0000000000000000 (NULL) 0x0这告诉您,这个二进制文件所需的惟一库是libc.so.6 ( NEEDED条目)。
如果您真正的问题是“这个ELF二进制文件需要什么其他库”,那么这很容易获得:只需在动态符号表中查找DT_NEEDED条目即可。以编程的方式这样做相当容易:
starts).
.e_phoff告诉您在哪里查找具有PT_DYNAMIC .p_type.
Elf{32,64}_Dyn records.
.d_tag == DT_NEEDED.的文件头)。
瞧。
有点复杂:字符串(如libc.so.6 )不是PT_DYNAMIC的一部分。但是有一个指针指向它们在.d_tag == DT_STRTAB条目中的位置。例如,请参阅this answer代码。
https://stackoverflow.com/questions/60734480
复制相似问题