首页 > 其他 > 详细

重定位PC相对引用(PC-relative reference relocation)

时间:2015-04-14 11:12:23      阅读:474      评论:0      收藏:0      [点我收藏+]

重定位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相对引用:

引用的运行时地址:
refaddr = ADDR(s) + r.offset = 0x8048320 + 0x1e = 0x804833e
修改引用的值:
*refptr = (unsigned)(ADDR(r.symbol) + (*refptr - refaddr))
        = (unsigned)(0x804840c + (-4 - 0x804833e))
= (unsigned)(0xca)    (问题:为何不等于下面的0x16??实验了多次。)
【上面表示的含义就是根据swap符号的实际地址,来修正引用的值,“平移”】
在最后的可执行目标文件中,执行到下面一条指令时:
80483f1: e8 16 00 00 00       call   804840c <swap>

call指令的本质是把当前EIP(=80483f6)压栈,然后把函数入口地址加载到EIP中。进而开始执行swap代码块的指令。


参考:

(1)《CSAPP》


重定位PC相对引用(PC-relative reference relocation)

原文:http://blog.csdn.net/vonzhoufz/article/details/45038479

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!