<连接器和加载器>——概述连接器和加载器
0.涉及术语
(1)地址绑定
将抽象的符号与更抽象的符号绑定,如 sqrt 符号与地址 0x0020010绑定。
(2)符号解析
程序相互作用通过符号进行,如主程序调用库函数sqrt,连接器通过表明分配给sqrt的地址来解析这个符号,并且修改代码使call命令能调用该地址。
(3)程序加载
指数据从磁盘拷贝到内存,往往还包括分配存储空间、设置保护位、通过虚拟内存将虚拟地址映射到磁盘内存页上。
1.连接器
(1)主要负责工作
库查询、重定位、连接
(2)重定位
重定位就是重写绑定地址。
【1】重定位的发展
操作系统出现前,程序独占内存,运行前能确定运行地址,重定位在连接时确定。
操作系统出现后,程序共享内存,运行时确定运行地址,重定位在加载时确定。这时覆盖技术出现。
虚拟内存出现后,程序独占内存,连接时确定地址。覆盖技术淘汰。
【2】库与重定位
静态库
静态库在生成时完成一次地址绑定,连接时被调用的例程引入程序,并重定位。
动态库
程序运行前不会绑定地址。
(3)两边连接
(1)输入连接器的信息
目标文件 + 库文件 + ... == 连接器 ==》 目标文件
具体:
所有的目标文件和库文件都包含两个信息:各种段、符号表。
【1】程序分段
由于有了操作系统,一个程序的多个进程可能同时运行,为了节省空间,将程序分为会改变和不会改变部分,让同程序进程通用不会改变段,所以连接器必须将同类的段合在一起。
【2】符号表
符号表包含导入符号、导出符号,导入符号:文件未定义,单被引用。导出符号:文件定义,被其他文件引用。
(2)第一次扫描
扫描所有输入段信息,符号表,得出整个段大小和内存分布。
(3)第二次扫描
利用第一次扫描信息控制实际连接过程,会读取重定位目标代码,为符号引用替换成数字地址,调整代码和数据的内存地址以反映重定位的段地址,并将重定位代码写入输出目标文件。
同时还会输出文件头部信息、重定位的段和符号表信息。
如果调用了动态库,那么还要包含运行时连接器解析动态符号所需的信息。
另外,连接器还会生成少量代码和数据,例如程序启动需要被调用的指向各初始化例程的指针数组。
<连接器和加载器>——概述连接器和加载器的更多相关文章
- Lucene 03 - 什么是分词器 + 使用IK中文分词器
目录 1 分词器概述 1.1 分词器简介 1.2 分词器的使用 1.3 中文分词器 1.3.1 中文分词器简介 1.3.2 Lucene提供的中文分词器 1.3.3 第三方中文分词器 2 IK分词器的 ...
- jQuery Mobile 手动显示ajax加载器,提示加载中...
在使用jQuery Mobile开发时,有时候我们需要在请求ajax期间,显示加载提示框(例如:一个旋转图片+一个提示:加载中...).这个时候,我们可以手动显示jQuery Mobile的加载器,大 ...
- jvm(1)类的加载(二)(自定义类加载器)
[深入Java虚拟机]之四:类加载机制 1,从Java虚拟机的角度,只存在两种不同的类加载器: 1,启动类加载器:它使用C++实现(这里仅限于Hotspot,也就是JDK1.5之后默认的虚拟机,有其他 ...
- JVM类加载器是否可以加载自定义的String
前言 曾经有一次,面试官问到类加载机制,相信大多数小伙伴都可以答上来双亲委派机制,也都知道JVM出于安全性的考虑,全限定类名相同的String是不能被加载的.但是如果加载了,会出现什么样的结果呢?异常 ...
- jvm(1)类加载(一)(加载过程,双亲加载)
JVM类加载器机制与类加载过程 jvm虚拟机的种类: Hotspot(Oracle)(基本上都是在说这个) J9, JikesRVM(IBM) Zulu, Zing (Azul) Launcher是一 ...
- Java类加载器概述
Java类加载器概述 Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由Java 应用开发人员编写的. 系统提供的类加载器 引导类加载器 它用来加载 Java 的核心库,是用原生 ...
- Linux进程调度器概述--Linux进程的管理与调度(十五)
调度器面对的情形就是这样, 其任务是在程序之间共享CPU时间, 创造并行执行的错觉, 该任务分为两个不同的部分, 其中一个涉及调度策略, 另外一个涉及上下文切换. 1 背景知识 1.1 什么是调度器 ...
- Unity3d通用工具类之数据配置加载类-ini配置文件加载
Unity3d通用工具类之数据配置加载类-ini配置文件加载 上次我们讲过xml文件的加载配置管理,今天我们换个配置文件,也是比较常见的配置文件.ini格式的数据. 按照国际管理先贴一张啥是.ini文 ...
- JVM虚拟机-垃圾回收机制与垃圾收集器概述
目录 前言 什么是垃圾回收 垃圾回收的区域 垃圾回收机制 流程 怎么判断对象已经死亡 引用计数法 可达性分析算法 不可达的对象并非一定会回收 关于引用 强引用(StrongReference) 软引用 ...
随机推荐
- centos8用firewalld搭建防火墙
一,firewalld的systemd管理命令 启动:systemctl start firewalld 关闭:systemctl stop firewalld 查看状态:systemctl stat ...
- django—Form组件校验方法(is_valid)执行流程
1.从is_valid方法入手 def is_valid(self): """Return True if the form has no errors, or Fals ...
- Parcelable使用(一)
android有两种序列化方式:一是实现Serializable接口(是JavaSE本身就支持的),二是实现Parcelable接口(是Android特有功能,效率比实现Serializable接口高 ...
- .NET CORE 3.1.5 跨域设置
1.Startup配置 1 #region 跨域设置 2 //注意:放到services.AddMvc()之前 3 services.AddCors(options => { 4 options ...
- 为什么网上有很多人说Python不要学
随着"大数据""云计算""人工智能"等等科技的兴起,IT行业在今后三到五年将会迎来一个高速发展期.这也就意味着会出现大量的人才缺口,尤其 ...
- 对PatchGAN的感知域(receptive_field)理解
for basic discriminator of GANs 判别器用于感知生成器产生的合成图片和ground-truth的差异,并旨在实现区分出fake or real: 同时,判别器的输出也是经 ...
- new 正则
在做项目的过程中,使用正则表达式来匹配一段文本中的特定种类字符,是比较常用的一种方式,下面是对常用的正则匹配做了一个归纳整理. 匹配中文:[\u4e00-\u9fa5] 英文字母:[a-zA-Z]数字 ...
- 拖拽编写SVG图形化工具(二)
getAttributesNs/setAttributesNs element.setAttributeNS(namespace,name,value) namespace 是指定属性的命名空间的一个 ...
- 随便聊一聊&最近做的项目
好久没有发文章了,我并非闲着,而是把原来发博文的形式转成了写稿. 今年是非常特殊的一年,长这么大,从来没有休过如此漫长的寒假,也从未在家进行过一个月以上的远程办公,新冠肺炎对各行各业都产生了巨大影响, ...
- Gym102012A Rikka with Minimum Spanning Trees
题意 \(T\) 组数据,每组数据给定一个 \(n\) 个点,\(m\) 条边,可能含有重边自环的图,求出最小生成树的个数与边权和的乘积,对 \(10^9+7\) 取模. \(\texttt{Data ...