我正在编写一个userland 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
是函数的地址,但是我从哪里获取它?
编辑:我要求加载它的位置而不是它的定义,因此st_value
无关紧要
答案 0 :(得分:0)
你必须手动解析精灵。
此类信息可在符号表部分找到:
它包含文件中定义或引用的所有符号(程序入口点,变量地址等)的列表,与符号关联的地址以及指示类型的某种标记。符号
(来自The Linux Journal )
要查找符号表,请迭代这些部分,直到找到sh_type = SHT_SYMTAB
的部分,然后对其进行适当的解析。
符号表是Elf32_Sym
和/或Elf64_Sym
结构的数组。该方法的地址将分配给结构的st_value
成员,该成员相对于索引st_shndx
处的节标题。
有关详细信息,请参阅: