动态符号的地址来自何处

时间:2017-10-22 21:37:33

标签: c elf

我正在编写一个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无关紧要

1 个答案:

答案 0 :(得分:0)

你必须手动解析精灵。

此类信息可在符号表部分找到:

  

它包含文件中定义或引用的所有符号(程序入口点,变量地址等)的列表,与符号关联的地址以及指示类型的某种标记。符号

     

来自The Linux Journal

要查找符号表,请迭代这些部分,直到找到sh_type = SHT_SYMTAB的部分,然后对其进行适当的解析。

符号表是Elf32_Sym和/或Elf64_Sym结构的数组。该方法的地址将分配给结构的st_value成员,该成员相对于索引st_shndx处的节标题。

有关详细信息,请参阅: