我试图理解对库函数(让我们称之为func
)的动态链接process...the调用通过plt
表传递。我知道,当符号还没有重新定位时,函数的调用将从plt
表传递,该表包含一个指令(比如i1
),它指向i1
之后的下一条指令,该指令看起来像push $offset
:在将控制传递给动态链接器之后,该动态链接器使用函数的地址来修复相对的GOT
条目。offset
应该是重定位表中条目的索引,但是我不是understand...how,这个值可以通过读取可执行文件的elf来找到。是有可能的
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
的值是0x18
(十进制为24),但是读取objdump
的输出似乎表明printf
从第一个reloc条目开始的偏移量是0x1c
。
一些想法?
发布于 2011-11-05 16:08:05
这不是PLT的工作方式,真的。要了解它是如何工作的,我建议从reading this article开始。
发布于 2012-09-02 09:19:22
是的,偏移量是文件重定位表上的索引。
从ELF规范1.2版开始:
5.因此,程序在堆栈上推送重定位偏移量( offset )。重定位偏移量是重定位表中的32位非负字节偏移量。指定的重定位条目将具有类型R_386_JMP_SLOT,其偏移量将指定在前一条jmp指令中使用的全局偏移表条目。重定位条目还包含一个符号表索引,从而告诉动态链接器引用哪个符号,在本例中为name1。
但我不知道为什么你的结果会有这样的差异。
https://stackoverflow.com/questions/7259770
复制相似问题