0.涉及术语

  (1)地址绑定

    将抽象的符号与更抽象的符号绑定,如 sqrt 符号与地址 0x0020010绑定。

  (2)符号解析

    程序相互作用通过符号进行,如主程序调用库函数sqrt,连接器通过表明分配给sqrt的地址来解析这个符号,并且修改代码使call命令能调用该地址。

  (3)程序加载

    指数据从磁盘拷贝到内存,往往还包括分配存储空间、设置保护位、通过虚拟内存将虚拟地址映射到磁盘内存页上。

1.连接器

  (1)主要负责工作

    库查询、重定位、连接

  (2)重定位

    重定位就是重写绑定地址。

    【1】重定位的发展

      操作系统出现前,程序独占内存,运行前能确定运行地址,重定位在连接时确定。

      操作系统出现后,程序共享内存,运行时确定运行地址,重定位在加载时确定。这时覆盖技术出现。

      虚拟内存出现后,程序独占内存,连接时确定地址。覆盖技术淘汰。

    【2】库与重定位  

      静态库

        静态库在生成时完成一次地址绑定,连接时被调用的例程引入程序,并重定位。

      动态库

        程序运行前不会绑定地址。

  (3)两边连接

    (1)输入连接器的信息

      目标文件 + 库文件 + ... == 连接器 ==》 目标文件

      具体:

      所有的目标文件和库文件都包含两个信息:各种段、符号表。

      【1】程序分段

        由于有了操作系统,一个程序的多个进程可能同时运行,为了节省空间,将程序分为会改变和不会改变部分,让同程序进程通用不会改变段,所以连接器必须将同类的段合在一起。

      【2】符号表

        符号表包含导入符号、导出符号,导入符号:文件未定义,单被引用。导出符号:文件定义,被其他文件引用。

    (2)第一次扫描

      扫描所有输入段信息,符号表,得出整个段大小和内存分布。

    (3)第二次扫描

      利用第一次扫描信息控制实际连接过程,会读取重定位目标代码,为符号引用替换成数字地址,调整代码和数据的内存地址以反映重定位的段地址,并将重定位代码写入输出目标文件。

      同时还会输出文件头部信息、重定位的段和符号表信息。

      如果调用了动态库,那么还要包含运行时连接器解析动态符号所需的信息。

      另外,连接器还会生成少量代码和数据,例如程序启动需要被调用的指向各初始化例程的指针数组。   

<连接器和加载器>——概述连接器和加载器的更多相关文章

  1. Lucene 03 - 什么是分词器 + 使用IK中文分词器

    目录 1 分词器概述 1.1 分词器简介 1.2 分词器的使用 1.3 中文分词器 1.3.1 中文分词器简介 1.3.2 Lucene提供的中文分词器 1.3.3 第三方中文分词器 2 IK分词器的 ...

  2. jQuery Mobile 手动显示ajax加载器,提示加载中...

    在使用jQuery Mobile开发时,有时候我们需要在请求ajax期间,显示加载提示框(例如:一个旋转图片+一个提示:加载中...).这个时候,我们可以手动显示jQuery Mobile的加载器,大 ...

  3. jvm(1)类的加载(二)(自定义类加载器)

    [深入Java虚拟机]之四:类加载机制 1,从Java虚拟机的角度,只存在两种不同的类加载器: 1,启动类加载器:它使用C++实现(这里仅限于Hotspot,也就是JDK1.5之后默认的虚拟机,有其他 ...

  4. JVM类加载器是否可以加载自定义的String

    前言 曾经有一次,面试官问到类加载机制,相信大多数小伙伴都可以答上来双亲委派机制,也都知道JVM出于安全性的考虑,全限定类名相同的String是不能被加载的.但是如果加载了,会出现什么样的结果呢?异常 ...

  5. jvm(1)类加载(一)(加载过程,双亲加载)

    JVM类加载器机制与类加载过程 jvm虚拟机的种类: Hotspot(Oracle)(基本上都是在说这个) J9, JikesRVM(IBM) Zulu, Zing (Azul) Launcher是一 ...

  6. Java类加载器概述

    Java类加载器概述 Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由Java 应用开发人员编写的. 系统提供的类加载器 引导类加载器 它用来加载 Java 的核心库,是用原生 ...

  7. Linux进程调度器概述--Linux进程的管理与调度(十五)

    调度器面对的情形就是这样, 其任务是在程序之间共享CPU时间, 创造并行执行的错觉, 该任务分为两个不同的部分, 其中一个涉及调度策略, 另外一个涉及上下文切换. 1 背景知识 1.1 什么是调度器 ...

  8. Unity3d通用工具类之数据配置加载类-ini配置文件加载

    Unity3d通用工具类之数据配置加载类-ini配置文件加载 上次我们讲过xml文件的加载配置管理,今天我们换个配置文件,也是比较常见的配置文件.ini格式的数据. 按照国际管理先贴一张啥是.ini文 ...

  9. JVM虚拟机-垃圾回收机制与垃圾收集器概述

    目录 前言 什么是垃圾回收 垃圾回收的区域 垃圾回收机制 流程 怎么判断对象已经死亡 引用计数法 可达性分析算法 不可达的对象并非一定会回收 关于引用 强引用(StrongReference) 软引用 ...

随机推荐

  1. Mysql架构与内部模块-第二章

    接上文,上文简述到了Mysql中的查询缓存和解析器,今日我们继续. 先来看一段SQL:SELECT * FROM `jianghuadong`; 先假设我们数据库中并没有一张名为jianghuadon ...

  2. windows.h头文件中改变光标位置的函数——SetConsoleCursorPosition

    COORD 具体为 typedef struct COORD{ short X; short Y; } COORD,*PCOORD;     可以用来记录坐标. #include <iostre ...

  3. linux(centos8):用tr替换或删除字符

    一,tr命令的用途 tr命令可以替换或删除文件中的字符 它从标准输入设备读取数据, 处理完成将结果输出到标准输出设备 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnbl ...

  4. 圆形进度条的模仿1-DrawArc,DrawCircle,DrawText讲解

    1:画弧 canvas.drawArc(oval,startAngle,sweepAngle,useCenter,paint) 第一个参数:绘制的区域,oval可以是被定好了的一个区域,也可以将ova ...

  5. 【机器学习 Azure Machine Learning】使用Aure虚拟机搭建Jupyter notebook环境,为Machine Learning做准备(Ubuntu 18.04,Linux)

    问题描述 在Azure的VM中已经安装好Jupyter,并且通过jupyter notebook --port 9999 已经启动,但是通过本机浏览器,访问VM的公网IP,则始终是不能访问的错误.(T ...

  6. C# 微信共享收货地址 V1.6

    //使用微信共享收货地址在跳转到当前页面的路径上必须要包含Code和state这两个获取用户信息的参数//例如 <a href="ProductOrder.aspx?OID=<% ...

  7. git学习(六) git reset操作

    git reset 操作 git reset git reset HEAD 文件名 移除不必要的添加到暂存区的文件 git reset HEAD^ 或者 commitid 去掉上一次的提交 git r ...

  8. 为iOS编译FFmpeg静态库

    为iOS编译FFmpeg静态库 
 环境:OS X Yosemite (版本10.10.5) Xcode (Version 7.1.1 (7B1005)) 
 
 一.资料准备: (1)ffmpeg源 ...

  9. JDK新特性——Stream代码简洁之道的详细用法

    一.概述 Stream 是一组用来处理数组.集合的API,Stream API 提供了一种高效且易于使用的处理数据的方式. Java 8 中之所以费这么大的功夫引入 函数式编程 ,原因有两个: 代码简 ...

  10. eclipse之SSH配置spring【二】

    第一篇中配置struts完成(http://www.cnblogs.com/dev2007/p/6475074.html),在此基础上,继续配置spring. web.xml中增加listener,依 ...