我需要通过解析进程的内存来访问.symtab符号表。
目前,我的算法是:
- 获取动态段(程序头 p_type == PT_DYNAMIC)并遵循 p_vaddr
- 在此动态部分中搜索 DT_SYMTAB d_tag 并从 +4 偏移量 (d_ptr) 获取 ptr,这应该是我们实际的 .symtab 符号表。
但是,由于某种原因,我收到的是 .dynsym,而不是 .symtab,这是通过比较符号名称和从 readelf -Ws 检索到的其他信息来证明的。
那么,如何获取实际的.symtab ptr? 谢谢。
作为引用,我正在使用:
- https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#Program_header
- http://labmaster.mi.infn.it/Laboratorio2/CompilerCD/clang/l1/ELF.html
欢迎更多优质资源。
最佳答案
I need to access .symtab symbol table by parsing memory of the process.
这通常是不可能的,因为 .symtab
通常根本不会加载到进程内存中。
例如
readelf -WS foo.o | egrep ' \.(data|text|symtab)'
[ 1] .text PROGBITS 0000000000000000 000040 00001b 00 AX 0 0 1
[ 5] .data PROGBITS 0000000000000000 0000d0 000000 00 WA 0 0 1
[ 9] .symtab SYMTAB 0000000000000000 000130 000120 18 10 10 8
请注意,.data
和 .text
有 A
(可分配)标志,而 .symtab
则没有。 t。
However, instead of .symtab, for some reason, I'm receiving .dynsym
.dynsym
是运行时使用的唯一符号表,也是无需读取磁盘上的可执行文件即可获取的唯一符号表。
附注另请注意,完全剥离的二进制文件根本不会有 .symtab
,同时仍然可以完美运行。
关于runtime - 如何在运行时获取指向 elf .symtab 的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66355714/