我试图了解动态链接过程......对库函数的调用(我们称之为func
)通过plt
表。我知道当符号尚未重新定位时,函数的调用从plt
包含一个指令(比如i1
)的表传递,就像jmp *function_in_GOT
指向下一条指令之后的指令i1
一样push $offset
:在控件传递给修复相对的动态链接器之后GOT
带有函数地址的条目。offset
应该是重定位表中条目的索引,但我不明白......如何通过读取可执行文件的精灵来找到这个值。有可能
objdump --dynamic-reloc prog
找东西?例如,我编写了一个非常简单的程序,它只使用printf
andstrcpy
并且上一个命令的输出是:
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
是0x18
(十进制的 24),但读取 的输出objdump
似乎printf
从第一个 reloc 条目的偏移量是0x1c
。
一些想法?