重定位绝对引用(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