安卓SO中GOT REL PLT 作用与关系

169 篇文章 4 订阅
5 篇文章 0 订阅

转自:https://bbs.pediy.com/thread-221821.htm

之前写的太混乱,修改了一下~

1 got rel plt的由来

在代码中像这样调用其他so库中的函数、全局变量,
程序编译完成后,程序并不知道这些函数和变量的内存地址的,
因为它们都在别的so库,而这些so库可能存在进程中的任何内存地址。
所以,程序跑起来时,才能找到它们的地址,然后访问或执行。

 


·
·

·
·
BTW:
(1)程序从磁盘文件复制到进程内存中,叫装载
(2)找到上面说的那些函数/变量地址,叫重定位
(3)装载 + 重定位的整个过程,叫链接。
(4)负责完成这件事的,叫链接器。
·
·
·
·

2 那么本程序是如何找到这些外部变量\函数的地址的?

通过rel表 gpt表 和plt表的配合。

·
·
·
·

3 怎么配合的?

(1)rel表的作用是:

本程序装载进内存时,通过自己的rel表项告诉链接器,哪些地方需要重定位。
本程序装载进内存时,通过自己的rel表项告诉链接器,哪些地方需要重定位。
本程序装载进内存时,通过自己的rel表项告诉链接器,哪些地方需要重定位。
·
·

(2)got表的作用是:

用来存放链接器找到的 函数/变量地址。
用来存放链接器找到的 函数/变量地址。
用来存放链接器找到的 函数/变量地址。
·
·

(3)当程序执行到引用变量或调用函数时:

就去访问got表项找这个地址。
就去访问got表项找这个地址。
就去访问got表项找这个地址。
·
·

(4)啰嗦的解释下:

ELF中每一个这样不确定地址的地方,都会生成一个rel表项。
每个rel表项,都对应一个需要修正地址的地方。
·
每个rel表项,都对应指出一个got表项地址。
·
每个got表项用来存放找到的地址。
·
链接器将本模块装载进入进程内存时,
会遍历本模块的rel表项,得知谁需要修正,将修正的地址填入对应got项。
·
做这件事的时机是,链接器将本模块装载进入内存时,本模块init段代码运行前。
(android arm elf情况下,这种叫装载时重定位)
·
·

(4)总结来说就是:

REL项 ---> 需要修正地址的符号 / GOT项 ---> 最终的地址
REL项 ---> 需要修正地址的符号 / GOT项 ---> 最终的地址
REL项 ---> 需要修正地址的符号 / GOT项 ---> 最终的地址
·
·
·
·

4 观察实例 验证上面说

readelf -r xxx.so

IDA下的rel表

IDA下的got表

·
·
·
·

5 观察总结

(1)给模块外libc.so库的函数clock() 、变量optopt生成了相应的rel目

·

(2)没有给模块内的myFun()生成rel项

(因为它在本模块内,不需要链接器和rel got那套玩意,自己就能直接确定地址,这种方式叫相对寻址)
(但是也可用把这件事交给链接器做,也就是给它也生成相应的rel项和got项)
·

(3)给myVar生成了rel项和got项

·

(4)关于rel.dyn , rel.plt , R_ARM_JUMP_SLOT , R_ARM_GLOB_DAT这些东西先不说,以后再解释。

·
·
·
·

6 观察反汇编和运行时clock()等的访问,

验证上面说的rel got plt 的配合过程。

objdump -d --start-address=0xF94 --stop-address=0xFEC xxx.so
objdump -d --start-address=0xE10 --stop-address=0xE1C xxx.so

·
·
·
·

7 观察总结

图里都写清楚了,不熟悉同学多调试几次观察。这里就补充解释下plt部分。
·
·
偏移fbc处的ebffff93 bl e10 clock@plt,

实际上并没有跳转到外部的libc.so的clock()函数,
而是跳转到了自身的plt节中,接着看下plt出指令的内容。

·
·
objdump和ida的反汇编结果看起来并不相同,但实际是相同的,因为IDA显示的是伪指令。

 

objdump是这样反汇编的:

·
·
IDA是这样反汇编的:

·
·

plt这段指令什么意思呢?

其实就是读取clock()对应的got表项值,然后将值赋给PC跳转到clock()。
bl clock() →→→ plt →→→ got →→→ libc.so clock()
·
·

所以这里的plt的作用是:

读取函数其对应的got项的值,然后赋给PC。
·
·
·
·
·
·
·
至此,安卓ELF的GOT REL PLT 作用与关系就介绍完了。
有时间的话,下一篇打算叨叨下REL表重定位类型的内容。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值