1

我试图了解动态链接过程......对库函数的调用(我们称之为func)通过plt表。我知道当符号尚未重新定位时,函数的调用从plt包含一个指令(比如i1)的表传递,就像jmp *function_in_GOT指向下一条指令之后的指令i1一样push $offset:在控件传递给修复相对的动态链接器之后GOT带有函数地址的条目。offset应该是重定位表中条目的索引,但我不明白......如何通过读取可执行文件的精灵来找到这个值。有可能

objdump --dynamic-reloc prog

找东西?例如,我编写了一个非常简单的程序,它只使用printfandstrcpy并且上一个命令的输出是:

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

我们可以看到 的值offset0x18(十进制的 24),但读取 的输出objdump似乎printf从第一个 reloc 条目的偏移量是0x1c

一些想法?

4

2 回答 2

1

这不是 PLT 的工作方式,真的。要了解它是如何工作的,我建议您从阅读这篇文章开始。

于 2011-11-05T08:08:05.267 回答
1

是的,偏移量是文件重定位表上的索引。

从 ELF 规范版本 1.2 开始:

5. 因此,程序会在堆栈上压入一个重定位偏移量(offset)。重定位偏移是重定位表中的 32 位非负字节偏移。指定的重定位条目将具有 R_386_JMP_SLOT 类型,其偏移量将指定在前面的 jmp 指令中使用的全局偏移表条目。重定位条目还包含一个符号表索引,从而告诉动态链接器正在引用什么符号,在本例中为 name1。

但我不知道为什么你的结果有差异。

于 2012-09-02T01:19:22.293 回答