C语言 动态符号的地址从何而来

  • 本文关键字:地址 语言 动态 符号 c elf
  • 更新时间 :
  • 英文 :


我正在编写一个用户空间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 处的节标题。

有关更多信息,您可以参考:

  • 低频格式
  • 符号表格式
  • 读取精灵的源代码

最新更新