当前位置: 首页 > news >正文

程序员的自我修养第七章——动态链接 (下)

        接上一篇。

7.3 地址无关代码

        对于现代机器来说,引入地址无关代码并不麻烦,我们展示下各种模型的地址引用方式:

        1. 模块内部函数调用

        2. 模块内部的数据访问,如全局变量、静态变量。

        3. 模块外部的函数调用,跳转。

        4. 模块外部的数据访问。

        当编译器在编译 pic.c 时,它实际上并不能确定变量b和函数ext()是模块外部的还是模块内部的,因为它们有可能被定义在同一个共享对象的其他目标文件中。由于没法确定,编译器只能把它们都当作模块外部的函数和变量来处理。MSVC编译器提供了_declspec(dllimport)编译器扩展来表示一个符号是模块内部的还是模块外部的。

 1. 模块内部函数调用

        同一模块中的函数地址相对固定,寻址相对简单些,使用的是相对寻址,不需要重定位。

        这条指令中的后4个字节是目的地址相对于当前指令的下一条指令的偏移,即0xFFFFFFE8(Little-endian)。0xFFFFFFE8是-24的补码形式,即 bar 的地址为0x804835c+(-24)=0x8048344。那么只要bar和foo的相对位置不变,这条指令是地址无关的。即无论模块被装载到哪个位置,这条指令都是有效的。这种相对地址的方式对于jmp指令也有效。

        

2. 模块内部数据访问

         模块内部访问也是相对寻址。一个模块前面一般是若干个页的代码,后面紧跟着若干个页的数据,这些页之间的相对位置是固定的,也就是说,任何一条指令与它需要访问的模块内部数据之间的相对位置是固定的,那么只需要相对于当前指令加上固定的偏移量就可以访问模块内部数据了。现代的体系结构中,数据的相对寻址往往没有相对与当前指令地址(PC)的寻址方式,所以ELF用了一个很巧妙的办法来得到当前的PC值,然后再加上一个偏移量就可以达到访问相应变量的目的了。得到PC值的方法很多,我们来看看最常用的一种,也是现在ELF的共享对象里面用的一种方法:

 3. 模块间数据访问

        模块间数据访问相对麻烦些,因为地址要等到装载时才能确定。比如上面例子中的变量b,它被定义在其他模块中,并且该地址在装载时才能确定。我们前面提到要使得代码地址无关,基本的思想就是把跟地址相关的部分放到数据段里面,很明显,这些其他模块的全局变量的地址是跟模块装载地址有关的。ELF的做法是在数据段里面建立一个指向这些变量的指针数组,也被称为全局偏移表(Global Offset Table,GOT),当代码需要引用该全局变量时,可以通过GOT中相对应的项间接引用,它的基本机制如图7-7所示。

        当需要访问b时,程序会先找到GOT,然后根据GOT中的变量所对应的项找到变量的目标地址。链接器在装载模块的时候会查找每个变量所在地址,然后将各个项填入GOT,GOT。

未完待续!!!

http://www.lryc.cn/news/9505.html

相关文章:

  • 蓝桥杯刷题——基础篇(二)
  • PTA L1-049 天梯赛座位分配(详解)
  • Linux部分参数作用讲解
  • Java kafka
  • DBA之路---Stream数据共享同步机制与配置方法
  • CF1790E Vlad and a Pair of Numbers 题解
  • 漏洞预警|Apache Kafka Connect JNDI注入漏洞
  • 企业小程序开发步骤【教你创建小程序】
  • 刚性电路板的特点及与柔性电路板的区别
  • 扫码过磅+车牌识别,内蒙古蒙维过磅实现信息化管理
  • 蒙特卡洛计算圆周率
  • 生物信息场景下的用户需求
  • linux su(switch user)和sudo(superuser do)的区别?(sudo su与su的区别)
  • PostgreSQL的学习心得和知识总结(一百二十三)|深入理解PostgreSQL数据库开源扩展pg_dirtyread的使用场景和实现原理
  • ubuntu清理挖矿病毒
  • 【代码随想录训练营】【Day16】第六章|二叉树|104.二叉树的最大深度|559.n叉树的最大深度|111.二叉树的最小深度|222.完全二叉树的节点个数
  • transformer总结
  • dart flutter入门教程,开发手册 分享
  • 教育舆情监测关键词有哪些,TOOM教育舆情监测系统流程?
  • MySQL高级(一)
  • 如何将Python项目部署到新电脑上运行?
  • JVM和JAVA体系结构
  • (十)、通过云对象修改阅读量+点赞功能的实现【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】
  • 刷力扣的第一天脑子要长出来的感觉(怎么有人大四才开始啊啊啊啊啊啊啊啊啊啊啊啊,又是等成绩的一天,)
  • Nuclei文*件上*传FUZZ POC
  • 完美解决方案-雪花算法ID到前端之后精度丢失问题
  • 工程管理系统源码之高效的工程项目管理软件
  • 390. 消除游戏
  • springBoot JPA代码生成器
  • 相同月利率条件下不同还款方式贷款的APR与IRR研究