-
-
[原创]【ARM】安卓SO中GOT REL PLT 作用与关系
-
发表于:
2017-10-15 23:44
14798
-
[原创]【ARM】安卓SO中GOT REL PLT 作用与关系
之前写的太混乱,修改了一下~
clock()和optopt这两个符号不在本模块内。
由于这种依赖的外部SO库可能存在进程内存的任何地址,
所以程序编译完成后,程序并不知道这些函数和变量的内存地址的。
只有程序跑起来时,找到了依赖的SO模块加载地址,通过一系列结构的配合,
才能确定它们的地址以访问执行。
·
·
·
·
BTW:
(1)程序从磁盘文件复制到进程内存中,叫装载
(2)在进程内存中,找到上面说的那些函数/变量地址,叫重定位.(可能在本模块 也可能在外部SO模块)
(3)装载 + 重定位的整个过程,叫链接。
(4)负责完成这件事的,叫链接器。
·
·
·
·
·
·
·
·
本程序装载进内存时,通过自己的rel表项告诉链接器,哪些地方需要重定位。
本程序装载进内存时,通过自己的rel表项告诉链接器,哪些地方需要重定位。
本程序装载进内存时,通过自己的rel表项告诉链接器,哪些地方需要重定位。
·
·
用来存放链接器找到的 函数/变量地址。
用来存放链接器找到的 函数/变量地址。
用来存放链接器找到的 函数/变量地址。
·
·
就去访问got表项找这个地址。
就去访问got表项找这个地址。
就去访问got表项找这个地址。
·
·
ELF中每一个这样不确定地址的地方,都会生成一个rel表项。
每个rel表项,都对应一个需要修正地址的地方。
·
每个rel表项,都对应指出一个got表项地址。
·
每个got表项用来存放找到的地址。
·
链接器将本模块装载进入进程内存时,
会遍历本模块的rel表项,得知谁需要修正,将修正的地址填入对应got项。
·
做这件事的时机是,链接器将本模块装载进入内存时,本模块init段代码运行前。
(android arm elf情况下,这种叫装载时重定位)
·
·
REL项 ---> 需要修正地址的符号 / GOT项 ---> 最终的地址
REL项 ---> 需要修正地址的符号 / GOT项 ---> 最终的地址
REL项 ---> 需要修正地址的符号 / GOT项 ---> 最终的地址
·
·
·
·
readelf -r xxx.so
IDA下的rel表
IDA下的got表
·
·
·
·
·
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2019-6-12 11:04
被爱吃菠菜编辑
,原因: