标签:elf relocation
重定位PC相对引用(PC-relative reference relocation)
示例代码(main.c, swap.c )见之前的一篇文章,接下来分析目标文件。
<pic1 gcc -c main.o , objdump -rS main.o>
可以看到main中调用swap的call指令位于section offset 0x1d处,操作码是e8,操作数是32bit的引用0xfffffffc,即-4(little endian存储的),下一行显示的是swap这个symbol的relocation entry,r.offset=0x1e, r.symbol=swap, r.type=R_386_PC32. 这个relocation entry是告诉编译器修改位于该section位于偏移量为1e的32位引用,使得运行时可以指向swap。
<PIC2 , readelf -a p>
<PIC3, objdump -S p>
根据<PIC2>或者<PIC3>可以看到最后的可执行目标文件的section .text的地址ADDR(s) = ADDR(.text)=0x8048320, 根据<PIC3>可以看到最后的可执行目标文件中swap的指令地址是 ADDR(r.symbol)=ADDR(swap)=0x804840c.然后重定位一个PC相对引用:
引用的运行时地址:call指令的本质是把当前EIP(=80483f6)压栈,然后把函数入口地址加载到EIP中。进而开始执行swap代码块的指令。
参考:
(1)《CSAPP》
重定位PC相对引用(PC-relative reference relocation)
标签:elf relocation
原文地址:http://blog.csdn.net/vonzhoufz/article/details/45038479