android elf 重定位,elf可重定位记录

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

一.相关概念:

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

二.相关命令:

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

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

3fe6a7394242efa3f6d95e3a14e8dc21.png

65b63f42b1edf06fd7c91368327f9bee.png

三.绝对重定位:

方法:

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

4db5f7c1a7bcc0a9f3798b62eebbc9e2.png

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

ebfcaca5ce8f9250851ea22965acca98.png

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

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

ab6e797a0f6cac1503c33cb6072a0de6.png

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

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

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

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

fda8659fc1bfe09146d2fcdd2f34850e.png

四.相对重定位

方法:

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

9c23351b4741739347f0a70adb0b0350.png

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

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

1e3fbdd8d3e78ffd081ffa43b6f9c0b9.png

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

2aa5350707058bc24eff8443e384107b.png

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

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

9ec2d493c2cbc6ad376d8b404449e73a.png

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

计算后的结果0x46

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值