Linux 系统中,ELF动态链接文件被称为 动态共享对象(DSODynamic Shared Object),简称共享对象

文件拓展名为“.so”

动态链接下 一个程序可以被分成若干个文件:程序的主要部分 - 可执行文件 和 程序所依赖的共享对象(一个或多个.so文件),它们都可称作为程序的模块。

动态链接文件(共享对象)的装载地址为0x00000000;这并非工作时的实际地址,实际地址由装载器根据当前进程地址空间的空闲情况来动态分配一块足够大的虚拟地址空间给共享对象。

装载时重定位

基本思路:在链接时对所有的绝对地址的引用不作重定位,而把这一步放在装载时完成。一旦模块装载完成,既目标地址确定,那么系统将对程序中的所有绝对地址的引用进行重定位。

静态链接时的重定位称为 链接时重定位(Link Time Relocation)

动态链接时的重定位称为 装载时重定位(Load Time Relocation) gcc -shared

然而光有装载时重定位也不能解决所有问题,因为对于动态链接文件来讲,它时可以分为可修改数据部分和不可修改数据部分,如果只有装载重定位,那每个程序必须都有一个共享对象的副本,这样会很浪费内存

这样就引入来下一个话题

地址无关代码 (gcc -shared -fPIC)

基本思想: 把指令中需要被修改的部分分离出来,跟数据部分放在一起,这样指令部分就保持不变了,而数据部分为每个进程都有一个副本,

这就是地址无关代码(PIC, Position-independent Code)技术

共享对象模块内的地址引用分为四种情况:

1. 模块内部调用或跳转:

    它们之间位置固定,使用相对地址调用。

2. 模块内部数据访问

    同样使用相对寻址(使用当前(指令地址)PC + 偏移量)

3. 模块与模块之间的数据访问(重点)

    模块之间的数据访问,其目标地址需要等到装载后才能确定。

    这里的基本思想时将这部分与地址相关的指令的当前地址放入到数据段里面。

    ELF 的做法是在数据段中建立了一个 指向这些变量的指针数组 ,也被称为 全局偏移表(GOT, Global Offset Table),当代码需要引用该全局变量时,通过GOT间接引用,

    即GOT中记录着该外部函数真正的地址,装载器在做动态链接时,会查找每个外部符号的地址,然后填充到GOT的对应的项中。

    GOT 如何做到与指令无关的呢?(在.so 文件中对应 .got 段)

    1. 模块在编译期可以确定模块内部变量相对与当前指令的偏移,同样在编译期也可以确定GOT相对于当前指令的偏移。确定GOT的位置和确定内部变量的位置方法上时一样的,通过

     得到PC值然后加上一个偏移量即可得到GOT的位置。当然GOT中的每个地址对应于哪个符号(变量,函数都是符号)由编译期决定。

4. 模块间跳用和跳转

    此时与3.中方法类似,只是对应的GOT的位置保存的时目标函数的地址,通过GOT实现间接跳转

地址无关小结:

                    各种引用方式
  指令跳转和调用  数据访问
模块内部  相对跳转调用  相对访问
模块外部 GOT间接跳转访问 GOT间接跳转访问

转载于:https://www.cnblogs.com/gradyblog/p/8963785.html

ELF 文件 动态链接 - 地址无关代码(GOT)相关推荐

  1. linux程序卸载动态库,Intel平台下linux中ELF文件动态链接的加载、解析及实例分析(二): 函数解析与卸载...

    在 IBM Bluemix 云平台上开发并部署您的下一个应用. 相信读者已经看过了 Intel平台下Linux中ELF文件动态链接的加载.解析及实例分析(一): 加载的内容了,了解了ELF文件被加载的 ...

  2. 动态链接(地址无关技术)

    为什么要动态链接: 静态链接使得不同的程序开发者能够相对独立地开发和测试自己的程序模块,从某种意义上来讲大大促进了程序开发的效率,原先限制程序的规模也就随之扩大,但是慢慢的静态链接的缺点也暴露出阿里, ...

  3. ELF文件——动态链接

    前言 下文所示案例为运行在armV7架构.linux平台之下的动态库文件. ELF文件格式 链接器以ELF文件的固定格式对目标程序进行链接,程序加载器以ELF文件的固定格式对其进行解析.ELF文件的组 ...

  4. ELF文件装载链接过程及hook原理

    ELF文件格式解析 可执行和可链接格式(Executable and Linkable Format,缩写为ELF),常被称为ELF格式,在计算机科学中,是一种用于执行档.目的档.共享库和核心转储的标 ...

  5. Linux下的ELF文件、链接、加载与库(含大量图文解析及例程)

    Linux下的ELF文件.链接.加载与库 链接是将将各种代码和数据片段收集并组合为一个单一文件的过程,这个文件可以被加载到内存并执行.链接可以执行与编译时,也就是在源代码被翻译成机器代码时:也可以执行 ...

  6. 前嗅ForeSpider教程:采集图片/视频/资源文件的链接地址

    昨天为大家介绍了如何采集图片/视频/资源文件后,有小伙伴问我如何采集他们的链接地址,今天小编就为大家演示如何采集图片/视频/资源文件的链接地址,操作如下: 第一步:新建任务 ①点击左上角"加 ...

  7. Cortex-M3 动态加载一(地址无关代码实现)

    这篇文章是自己疑惑究竟地址无关性是如何实现,然后查看汇编和CPU指令手册,最后分析解除自己疑惑的,高手不要鄙视,哈哈. 编译C代码时候需要制定--acps/ropi选项,如下例子: 1 void Sy ...

  8. 【嵌入式开发】ARM 代码搬移 ( ARM 启动流程 | 代码搬移 起点 终点 | 链接地址 | 汇编代码 )

    文章目录 一. ARM 启动流程 1. 各种类型开发板启动流程 ( 1 ) 2440 开发板启动流程简介 ( ① Nand Flash 拷贝 4 KB -> SRAM 垫脚石 | ② PC 指向 ...

  9. 计算机系统基础第四篇-6 elf文件的链接

    链接两步 elf文件链接分成两个步骤,第一步是符号解析,第二步是重定位. 1.1 符号解析 1.2 重定位 可重定位目标文件 linux平台下,可重定位目标文件为elf文件,elf由多个节构成. 3. ...

最新文章

  1. 简单数据结构(队列 栈 树 堆 )
  2. 【译】The Faults and Shortcomings of the EVM
  3. C++实现对汉字的完美支持
  4. 唐刘之辩:行业知识图谱的schema构建的难点、重点与困惑
  5. 微信公布6月朋友圈十大谣言 包括不打疫苗不让上飞机高铁等
  6. Android音乐播放器-使用FFmpeg及OpenSLES
  7. python 搭建web_webpy搭建一个简单的网站
  8. 基于pyspark 大数据分析_基于阿里云平台的大数据教学案例 —— B站弹幕数据分析...
  9. 软件设计师中级考试经验总结
  10. windows 10和windows server 2016系统AD的administrator密码修改
  11. JAVA 通过POI实现Excel从单元格选择下拉选项
  12. Ubuntu 20.04LTS 搜狗输入法不显示图标
  13. PHP开发API签名验证
  14. 编写产生(0,1)上的均匀分布的伪随机数的函数
  15. 2020北京邮电大学计算机学院复试经验分享
  16. 怎么实现EDIUS中添加的图片素材一样大
  17. JS 城市选择实现——按级选中省市县/区
  18. 计算机进入低能耗休眠状态,电脑如何设置成不用自动进入休眠状态
  19. java怎么开发图形界面_Java Swing 图形界面开发简介
  20. 记一次使用百度云加速开启ssl后网站打不开的解决办法

热门文章

  1. 细节决胜 盘点IBM x86平台虚拟化优势
  2. struts2框架从数据库批量取得数据集并在前台页面循环显示
  3. 一笔画问题 连通图(搜索+队列)
  4. Socket简介及客户端服务器连接实例
  5. C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别
  6. SQL Server Extended Events (扩展事件)
  7. 《我在51CTO微职位学软考——奋发之路》
  8. H3C 交换机升级说明
  9. 数字采购:企业互联网新引擎
  10. 阿里内核月报2015年03月