我正在编写一个用户空间elf加载器作为副项目,以了解有关ELF文件及其工作原理的更多信息。我想知道从哪里获取地址以从动态库(libc.so.6
)加载符号。当我反汇编程序时,我得到:
$objdump -d test | grep puts
400420: ff 25 f2 0b 20 00 jmpq *0x200bf2(%rip) # 601018 <puts@GLIBC_2.2.5>
函数所在的地址0x200bf2
,但我从哪里获取它?
编辑:I我问的是在哪里加载而不是在哪里定义它,所以st_value
无关紧要
你必须手动解析精灵。
此类信息可以在"符号表"部分找到:
它包含文件中定义或引用的所有符号(程序入口点、变量地址等)的列表、与符号关联的地址以及指示符号类型的某种标记。
(摘自《The Linux Journal》)
要查找符号表,请遍历这些部分,直到找到sh_type = SHT_SYMTAB
的部分,然后对其进行适当的解析。
符号表是Elf32_Sym
和/或Elf64_Sym
结构的数组。该方法的地址将分配给结构st_value
成员,该成员相对于索引 st_shndx
处的节标题。
有关更多信息,您可以参考:
- 低频格式
- 符号表格式
- 读取精灵的源代码