如何转储 ELF 文件的 .dynsym 部分?

how to dump the .dynsym section of an ELF file?

.dynsym 部分是一堆按顺序排列的 ElfN_Sym 结构,所以我'我试图转储所有符号的 st_name 但显然我解析文件的方式有问题。

我做的第一件事是通过迭代 headers 部分并比较 [=36= 来获取 .dynsym 部分的索引]字段通过字符串table。然后我通过 sh_addr 字段得到了 .dynsym 的地址:

Elf64_Sym *symbol = (Elf64_Sym *) shdr[i].sh_addr;
printf("%s\n", symbol->st_name);  

然而,由于某种原因,这是 SEGFAULTing,我做错了什么,正确的方法是什么?另外,使用 shdr[i].sh_addr&shdr[i]?

有区别吗

This however is SEGFAULTing for some reason,

SIGSEGVs 因为 symbol->st_name 不是指向字符串的指针,它是实际字符串所在的 .dynstr 部分的偏移量。

为了打印名称,您必须read.dynstr的内容放入缓冲区(或mmap .dynstr部分),并使用st_name 作为该缓冲区的偏移量。