动态链接:用于索引重定位表的偏移值

时间:2011-08-31 15:52:28

标签: dynamic-linking dynamic-library

我正在尝试理解动态链接过程...对库函数的调用(让我们称之为func)通过plt表。我知道当符号尚未重新定位时,函数的调用从plt表传递,该表包含一个is {(i1),如jmp *function_in_GOT,它指向{{1}之后的下一条指令看起来像i1:在控件传递给动态链接器之后,动态链接器使用函数的地址修复相对push $offset条目。 GOT应该是重定位表中条目的索引,但我不明白......如何通过读取可执行文件的精灵来查找此值。可以

offset
找一些东西?例如,我写了一个非常简单的程序,只使用objdump --dynamic-reloc prog printf,上一个命令的输出是:

strcpy

例如,使用DYNAMIC RELOCATION RECORDS OFFSET TYPE VALUE 08049ff0 R_386_GLOB_DAT __gmon_start__ 0804a000 R_386_JUMP_SLOT __gmon_start__ 0804a004 R_386_JUMP_SLOT __libc_start_main 0804a008 R_386_JUMP_SLOT strcpy 0804a00c R_386_JUMP_SLOT printf 阅读从gdb开始的说明:

printf@plt

我们可以看到0x8048324 <printf@plt>: jmp *0x804a00c 0x804832a <printf@plt+6>: push $0x18 0x804832f <printf@plt+11>: jmp 0x80482e4 的值为offset(十进制为24),但是读取0x18的输出似乎是objdump与第一个reloc的偏移量条目是printf

一些想法?

2 个答案:

答案 0 :(得分:1)

这不是PLT的工作原理。要了解 的工作原理,建议您从reading this article开始。

答案 1 :(得分:1)

是的,offset是文件重定位表的索引。

来自ELF规范版本1.2:

5。因此,程序在堆栈上推送重定位偏移量(偏移量)。重定位偏移量为a     重定位表中的32位非负字节偏移量。指定的重定位条目将具有     输入R_386_JMP_SLOT,其偏移量将指定前一个使用的全局偏移表项     jmp指令。重定位条目还包含符号表索引,从而告知动态     链接器引用了什么符号,在这种情况下为name1。

但我不知道为什么结果会出现差异。