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

重定位绝对引用(absolute reference relocation)

时间:2015-04-14 13:02:28      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

重定位绝对引用(absolute reference relocation)

  还是承接前面的程序,在swap.c中 “int *bufp0 = &buf[0];”bufp0被初始化为一个全局的数组地址,所以需要重定位,详细信息如图<PIC1>和<PIC2>, r.offset=0xc, r.symbol=buf, r.type=R_386_32 ,重定位条目告诉编译器,这是一个32位的绝对引用,必须重定位才能指向最后的buf。
<PIC1, objdump -rS swap.o>
技术分享

<PIC2, readelf -a swap.o >
技术分享

<PIC3, readelf -a p>

技术分享

通过分析目标文件可以知道buf的运行时地址,如图<PIC3>, ADDR(r.symbol)=ADDR(buf)=0x0804a014, 然后重定位:
*refptr = (unsigned)(ADDR(r.symbol) + *refptr)
= (unsigned)(0x0804a014 + 0) 
= (unsigned)(0x0804a014)

在最后的可执行目标文件中,如图<PIC4>,正是印证了这一点。看到位于0x0804a028的bufp0中存储的值正是0x0804a014(小端)。

<PIC4, objdump -d -j .data>

技术分享




重定位绝对引用(absolute reference relocation)

标签:

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

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