elf可重定位记录

注:部分引用自https://blog.csdn.net/ylcangel/article/details/18188921
一.相关概念: 重定位条目:当汇编器生成一个目标模块时,它并不知道数据和代码最终将存放在存储器中的什么位置。它也不知道这个模块引用的任何外部定义的函数和全局变量。所以,无论何时汇编器遇到对最终位置未指定目标引用,它就会生成一个重定位条目,告诉链接器在将目标文件合并可执行文件时如何修改这个引用。代码重定位条目放在.rel.text中。已经初始化数据的重定位条目放在.rel.data中。即重定位条目位于目标文件中
二.相关命令: 1.readelf -r xxx.o,可以读取目标文件中的可重定位信息
2.objdump -d xxx.o,可以查看汇编代码

elf可重定位记录
文章图片

elf可重定位记录
文章图片

三.绝对重定位: 方法:
1.从可执行文件中获取符号表中,变量a对应的符号的值,此值为S=0x0804a01c
elf可重定位记录
文章图片

2.从目标文件中获取A值,先从目标文件中获取可重定位信息,通过readelf -r main.o
elf可重定位记录
文章图片

offset = 0x19,为在目标文件中的偏移,然后根据此offset值,在汇编文件中查找A值
查看汇编代码:objdump -d main.o,A=0x00000000,0x18处为指令0xa1(可根据此指令在main中修改计算后的值)
elf可重定位记录
文章图片

最终的值为:S+A = 0x0804a01c
3.验证可执行文件中的此值
根据0x18处的指令为0xa1,在main可执行文件的汇编代码中,验证我们计算的值和链接产生的值是否一致
objdum -d main |grep a1,可以看到a1后面的地址为 0x0804a01c(小端模式)
elf可重定位记录
文章图片

四.相对重定位 方法:
.1.从可执行文件中获取符号表中,函数sum对应的符号的值,此值为S=0x0804847a
elf可重定位记录
文章图片

2.从目标文件中获取A值,先从目标文件中获取可重定位信息,通过readelf -r main.o,
在目标文件中的偏移为0x25
elf可重定位记录
文章图片

然后根据此offset值,在汇编文件中查找A值为0xfcffffff
elf可重定位记录
文章图片

3.在可执行文件中查找P值,根据在目标文件中0x25偏移处A值,其前一个地址0x24为指令0xE8,根据
此指令0xe8,在可执行文件中找到P值,此处0xe8指令在地址0x804842f处,下一个地址0x8048430为P值
elf可重定位记录
文章图片

Result = S + A - P = 0x0804847a + 0xfcffffff - 0x8048430 = 0x46,小端地址,所以0x8048430地址处的值,存放
计算后的结果0x46
【elf可重定位记录】

    推荐阅读