如何使用C ++在Linux中获取elf二进制文件所需的所有动态库列表?
一旦我从二进制文件中提取了信息(文件名?),我可以通过搜索PATH
找到实际文件,但我还没有找到有关从ELF二进制文件中提取未改变信息的任何信息。
有什么想法吗?
如何使用C ++在Linux中获取elf二进制文件所需的所有动态库列表?
一旦我从二进制文件中提取了信息(文件名?),我可以通过搜索PATH
找到实际文件,但我还没有找到有关从ELF二进制文件中提取未改变信息的任何信息。
有什么想法吗?
readelf -d /usr/bin/readelf | grep NEEDED
0x0000000000000001 (NEEDED) Shared library: [libz.so.1]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
ET_EXEC
或ET_DYN
)。e_phoff/e_phnum/e_phentsize
),检查它们是否非零且有效。PT_DYNAMIC
。同时记住PT_LOAD
段的虚拟地址 -> 文件偏移映射。DT_NEEDED
和DT_STRTAB
条目。DT_NEEDED
条目中的d_val
字段是指向DT_STRTAB
字符串表的偏移量,该字符串表将是所需库的SONAME。请注意,由于DT_STRTAB
条目是运行时地址而不是字符串表的偏移量,因此您需要使用存储在第3步中的信息将其映射回文件偏移量。
您可以使用 libelf
来实现此操作。请注意,libelf
具有 C API。
从他们的教程 这里,查看第4.2节中的示例(或这里)以获取程序头表。找到 DT_DYNAMIC
部分,并像第5.4节中的示例(或这里)中的方式从字符串表中读取依赖项。
-- 编辑 --
实际上我有机会编写代码。以下是我的代码:
#include <assert.h>
#include <fcntl.h>
#include <gelf.h>
#include <stdio.h>
#include <unistd.h>
void print_dt_needed(const char *elf_path) {
assert(elf_version(EV_CURRENT) != EV_NONE);
int fd = open(elf_path, O_RDWR, 0);
assert(fd >= 0);
Elf *elf = elf_begin(fd, ELF_C_READ, NULL);
assert(elf != NULL);
assert(elf_kind(elf) == ELF_K_ELF);
Elf_Scn *scn = NULL;
while ((scn = elf_nextscn(elf, scn)) != NULL) {
GElf_Shdr shdr = {};
assert(gelf_getshdr(scn, &shdr) == &shdr);
if (shdr.sh_type == SHT_DYNAMIC) {
Elf_Data *data = NULL;
data = elf_getdata(scn, data);
assert(data != NULL);
size_t sh_entsize = gelf_fsize(elf, ELF_T_DYN, 1, EV_CURRENT);
for (size_t i = 0; i < shdr.sh_size / sh_entsize; i++) {
GElf_Dyn dyn = {};
assert(gelf_getdyn(data, i, &dyn) == &dyn);
if (dyn.d_tag == DT_NEEDED) {
printf("DT_NEEDED detected: %s\n",
elf_strptr(elf, shdr.sh_link, dyn.d_un.d_val));
}
}
}
}
assert(elf_end(elf) == 0);
assert(close(fd) == 0);
}
int main(int argc, char const *argv[]) {
print_dt_needed(argv[1]);
return 0;
}
foo
动态链接到libbar.so
,而libbar.so
本身又动态链接到libgee.so
,因此ldd foo
将同时显示libbar.so
和libgee.so
)? - Basile Starynkevitchreadelf -d
直接查找 Linux ELF 二进制文件的共享对象依赖关系:https://dev59.com/6m025IYBdhLWcg3wEhZb,使用ldd
间接查找:http://unix.stackexchange.com/questions/120015/how-to-find-out-the-dynamic-libraries-executables-loads-when-run - Ciro Santilli OurBigBook.com