runtime - 如何在运行时获取指向 elf .symtab 的指针?

标签 runtime elf segment

我需要通过解析进程的内存来访问.symtab符号表。

目前,我的算法是:

  1. 获取动态段(程序头 p_type == PT_DYNAMIC)并遵循 p_vaddr
  2. 在此动态部分中搜索 DT_SYMTAB d_tag 并从 +4 偏移量 (d_ptr) 获取 ptr,这应该是我们实际的 .symtab 符号表。

但是,由于某种原因,我收到的是 .dynsym,而不是 .symtab,这是通过比较符号名称和从 readelf -Ws 检索到的其他信息来证明的。

那么,如何获取实际的.symtab ptr? 谢谢。

作为引用,我正在使用:

  1. https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#Program_header
  2. 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.textA(可分配)标志,而 .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/

相关文章:

c - 是否有适用于 *.elf 和 *.axf 的代码大小分析工具?

assembly - 8086 中的堆栈段和堆栈指针

c - 为什么 C 运行时不调用我的 exit()?

algorithm - 几何概率分布顺序搜索的平均案例分析

symbols - 在运行时动态修改符号表(C语言)

c - C 中的内存段——文本段

java - 在运行时将 dex 添加到 Android 类路径

c - 如何在C结构中打印变量

executable - 字节码(如 Java 字节码)和文件和机器代码可执行文件(如 ELF)有什么区别?