码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-04-14 11:13:29      阅读:257      评论:0      收藏:0      [点我收藏+]

标签: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相对引用:

引用的运行时地址:
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)

标签:elf   relocation   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!