柳条青青,南风熏熏,幻化奇峰瑶岛,一天的黄云白云,那边麦浪中间,有农妇笑语殷殷。问后园豌豆肥否,问杨梅可有鸟来偷;好几天不下雨了,玫瑰花还未曾红透;梅夫人今天进城去,且看她有新闻无有。—— 徐志摩·夏日田间即景

ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287

无论是可执行文件还是 so,只要它依赖于其他 so(.dynsym 动态符号表中有导入符号存在),那么在编译链接阶段,这些符号的地址未知,所以只能在动态链接阶段对其进行地址重定位。

注意:以 PIC 编译的 so,虽然称“地址无关代码”,但也需要重定位。因为对于 PIC 的 so 来说,只不过是把代码中的绝对地址提出来,放到了数据段的 GOT 表中。所以,虽然代码段不需重定位,但数据段的 GOT 表需要重定位。(以 PIC 编译 so,是为了复用 so 的代码段)

以 android liblog.so 为例。在代码中调用 memset 时,实际上会跳转到标号 memset_ptr 指向的内存。

而标号 memset_ptr 指向的内存就定义在 GOT 表中:

那么如何为 GOT 表做重定位呢?GOT 表中的每一项应该指向哪一个符号在内存中的地址呢?这些信息就由重定位表来描述。具体到 android 来说,重定位表保存在 .rel.dyn 和 .rel.plt 中。

从表中可以看出,位于 .rel.dyn 中的主要是 R_ARM_GLOB_DAT 类型的重定位项,而位于 .rel.plt 中的主要是 R_ARM_JUMP_SLOT 类型的重定位项。前者用于对数据引用做重定位,而后者用于对函数引用做重定位。除此之外,还看到了 R_ARM_RELATIVE 类型的重定位。

在 android linker 的源码中,调用了两次 soinfo_relocate 函数,分别为 .rel.dyn 和 .rel.plt 做重定位:

在 soinfo_relocate 函数的源码中可以看到,对于不同类型的重定位,计算符号地址的方式也有所不同。

实际上对于 R_ARM_GLOB_DAT、R_ARM_JUMP_SLOT 这两种重定位类型来说,只需将符号地址填入被修正的内存即可。而 R_ARM_RELATIVE 类型看起来特殊些,它的作用是进行基址重置 (Rebasing) 。

比如指针 p 指向静态变量 a,而静态变量 a 相对于 so 基址的偏移为 A。在编译时,so 的基址为 0,此时 p 的值为 A。而当 so 被装载到内存中时,p 的值就需要加上一个 so 在内存中的基址 base。R_ARM_RELATIVE 类型的重定位就是用来干这个的。

对于 android linker 的重定位细节,以及其他重定位类型,在后面写 android linker 源码分析笔记时再描述。

学习资料: 《程序员的自我修养——链接、装载和库》

转载于:https://www.cnblogs.com/ilocker/p/4641769.html

了解动态链接(六)—— 重定位表相关推荐

  1. PE学习(六)第六章 栈与重定位表 实例栈溢出、模拟加载器加载DLL、遍历重定位表

    第六章 栈与重定位表 16bit OS 存在长调用 lcall push cs,ip    相应的iret pop ip, cs  而call/ret only focus ip register 3 ...

  2. PE结构基址重定位表

    PE体系 PE结构&整体叙述 PE结构&导入表 PE结构&导出表 PE结构&基址重定位表 PE结构&绑定导入实现 PE结构&延迟加载导入表 重定位表定位 ...

  3. PE格式第七讲,重定位表

    PE格式第七讲,重定位表 作者:IBinary 出处:http://www.cnblogs.com/iBinary/ 版权所有,欢迎保留原文链接进行转载:) 一丶何为重定位(注意,不是重定位表格) 首 ...

  4. Windows PE第6章 栈与重定位表

    第六章 栈与重定位表 本章主要介绍栈和代码重定位.站和重定位表两者并没有必然的联系,但都和代码有关.栈描述的是代码运行过程中,操作系统为调度程序之间相互调用关系,或临时存放操作数而设置的一种数据结构. ...

  5. exe文件解析_PE文件格式之重定位表

    一.重定向表的作用: 这个在网上有很多种解释,那我也说一下自己对这个表的解释,程序运行的时候一般有两种方式来调用函数就是OD的那个CALL,一个是基址+偏移,另一种就是写死的函数地址比如 CALL 0 ...

  6. 移动重定位表到新增节

    一.为什么要移动重定位表 数据目录中的表是分散在各个节里的,如果对节进行加密,操作系统找不到表,就无法加载程序.因此加密前要先把表移动到新的节里. 二.怎么移动 计算重定位表的大小,首先要遍历重定位表 ...

  7. 操作系统是如何使用重定位表的

    一.重定位表的结构 重定位表是数据目录中第6项,它的结构如图示: 重定位表由多个块(block)组成,每个块内部由三部分组成--VirtualAddress.SizeOfBlock 和若干个2字节偏移 ...

  8. 写一个PE的壳_Part 2:ASLR+修复输入表(IAT)+重定位表支持(.reloc)

    系列汇总 写一个PE的壳_Part 1:加载PE文件到内存 写一个PE的壳_Part 2:ASLR+修复输入表(IAT)+重定位表支持(.reloc) 写一个PE的壳_Part 3:Section里实 ...

  9. elf文件中代码段有绝对地址但重定位表中无.text.rel

    阅读<程序员的自我修改>第三章 中关于ELF 文件结构描述 关于重定位表 P79时候产生的问题. 文章中说只要有绝对地址的段,就会有重定位.但是readelf -S helloWorld. ...

最新文章

  1. sharepoint 2007 网站操作 显示菜单不全
  2. 模拟浏览器自动化测试工具Selenium之四cssSelector元素定位开发篇
  3. php处理小程序上传图片,微信小程序上传图片,PHP-Laravel框架实现
  4. linux通过c语言编程访问远程mysql
  5. 好用的Markdown编辑器推荐
  6. 为什么会有那么多人放弃编程?
  7. 第一章 CLR执行模型
  8. ros中订阅/map话题,获取地图尺寸,获取机器人原点origin,获取地图分辨率resolution (c++,python,waitForMessage,wait_for_message)
  9. JavaScript闭包 懂不懂由你反正我是懂了
  10. c++ 编程规范技巧
  11. vue基础-25-vue的基础面试知识
  12. php对接海康视频教程_海康安防管理平台Web视频对接
  13. composer错误Could not find package 的解决方法
  14. TI公司电话面试 ---- 问题回忆录 2012年8月20
  15. 5、设备树操作reg
  16. 云脉H5文档管理系统之文件管理的共享与协作
  17. 基于java web的网上书店系统
  18. 需求分析阶段的各个步骤
  19. Cocos2d-x Lua库函数剖析(二)cocos2d
  20. AMD统一渲染GPU架构 历程回顾与评测

热门文章

  1. ajax跨域时使得后台的sessionid不断地的变化,以及layui表格支持跨域的方法,java
  2. C语言面向对象编程(六):配置文件解析
  3. CMake基础 第3节 静态库
  4. mysql数据库在查询的时候不能使用字段别名,字段别名只在显示的时候显示出来
  5. linux下的X server:linux图形界面原理
  6. 解决linux不能安装g++问题
  7. masm汇编标号用法总结
  8. mysql删除不存在行数据报错_MySQL学习笔记11复制错误处理(二)删除不存在的行的问题...
  9. Acknowledgement Modes
  10. tp5 隐藏index.php