<连接器和加载器>——概述连接器和加载器
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) 软引用 ...
随机推荐
- MeteoInfoLab脚本示例:获取气团轨迹每个节点的气象数据
读取HYSPLIT输出的轨迹数据文件和相应时间的气象数据文件,生成轨迹图层,循环每条轨迹的节点,读出该节点的经度.纬度.气压.时间,通过对气象数据插值获得该节点的气象数据.脚本程序: #------- ...
- 编程语言拟人:来自C++、Python、C语言的“傲娇”自我介绍!
软件工程领域,酷爱编程的人很多,但另一些人总是对此避之不及.而构建软件无疑会让所有人压力山大,叫苦连连. 来看看这些流行编程语言的"内心独白",JAVA现实,C++傲娇,Rus ...
- go正则贴吧
package main import ( "fmt" "io/ioutil" "net/http" "regexp" ...
- lumen发送邮件配置
composer.json 增加 "illuminate/mail":"5.6"composer update -vvvconfig 目录新建mail.php ...
- 【Azure云服务 Cloud Service】如何在部署云服务Cloud Service时候通过启动任务Start Task来配置IIS (如开启ARR)
问题情形 通过VS部署Cloud Service时,需要在开始任务时候安装或配置其他任务,如安装及配置ARR. 执行步骤 1) 下载 requestRouter_amd64.msi 和 webfarm ...
- JS DIV列表自动滚动带停顿,滚动到底部后自动滚动到顶部
setInterval -- 间隔执行函数:element.scrollTop -- 元素滚动条距头部的距离: 因为执行代码需要时间,所以最终动态时间会比设置的要慢 var slide = new S ...
- WSL2和CUDA踩坑
WSL2和CUDA踩坑 WSL2里可以直接跑cuda了, 目前(2020年10月) 功能可用, 但bug很多, 不够完善 1. 安装 主要参考: https://docs.nvid ...
- okhttp的Post方式
发送post请求 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bun ...
- 前端-jstree 一些常用功能
最近使用到了jstree(v3.3.4)这个插件(官网:https://www.jstree.com/),在这里记录下我的使用过程的一些技巧和问题. 1. 获取数据 一般实际项目中用到的数据都是aja ...
- JUC---08ForkJion(分支合并)
一.什么是ForkJion Fork/Join框架是Java7提供的并行执行任务框架,思想是将大任务分解成小任务,然后小任务又可以继续分解,然后每个小任务分别计算出结果再合并起来,最后将汇总的结果作为 ...