elf可重定位记录

注:部分引用自https://blog.csdn.net/ylcangel/article/details/18188921

一.相关概念:

重定位条目:当汇编器生成一个目标模块时,它并不知道数据和代码最终将存放在存储器中的什么位置。它也不知道这个模块引用的任何外部定义的函数和全局变量。所以,无论何时汇编器遇到对最终位置未指定目标引用,它就会生成一个重定位条目,告诉链接器在将目标文件合并可执行文件时如何修改这个引用。代码重定位条目放在.rel.text中。已经初始化数据的重定位条目放在.rel.data中。即重定位条目位于目标文件中

二.相关命令:

    1.readelf -r xxx.o,可以读取目标文件中的可重定位信息

    2.objdump -d xxx.o,可以查看汇编代码


三.绝对重定位:

方法:

1.从可执行文件中获取符号表中,变量a对应的符号的值,此值为S=0x0804a01c

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

offset = 0x19,为在目标文件中的偏移,然后根据此offset值,在汇编文件中查找A值

查看汇编代码:objdump -d main.o,A=0x00000000,0x18处为指令0xa1(可根据此指令在main中修改计算后的值)

最终的值为:S+A = 0x0804a01c

3.验证可执行文件中的此值

根据0x18处的指令为0xa1,在main可执行文件的汇编代码中,验证我们计算的值和链接产生的值是否一致

objdum -d main |grep a1,可以看到a1后面的地址为 0x0804a01c  (小端模式)

四.相对重定位

方法:

.1.从可执行文件中获取符号表中,函数sum对应的符号的值,此值为S=0x0804847a

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

在目标文件中的偏移为0x25

然后根据此offset值,在汇编文件中查找A值为0xfcffffff

3.在可执行文件中查找P值,根据在目标文件中0x25偏移处A值,其前一个地址0x24为指令0xE8,根据

此指令0xe8,在可执行文件中找到P值,此处0xe8指令在地址0x804842f处,下一个地址0x8048430为P值

Result = S + A - P = 0x0804847a + 0xfcffffff - 0x8048430 = 0x46,小端地址,所以0x8048430地址处的值,存放

计算后的结果0x46

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

科技之光666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值