我正在尝试理解动态链接过程...对库函数的调用(让我们称之为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
。
一些想法?
答案 0 :(得分:1)
这不是PLT的工作原理。要了解 的工作原理,建议您从reading this article开始。
答案 1 :(得分:1)
是的,offset是文件重定位表的索引。
来自ELF规范版本1.2:
5。因此,程序在堆栈上推送重定位偏移量(偏移量)。重定位偏移量为a 重定位表中的32位非负字节偏移量。指定的重定位条目将具有 输入R_386_JMP_SLOT,其偏移量将指定前一个使用的全局偏移表项 jmp指令。重定位条目还包含符号表索引,从而告知动态 链接器引用了什么符号,在这种情况下为name1。
但我不知道为什么结果会出现差异。