<连接器和加载器>——概述连接器和加载器

0.涉及术语

  (1)地址绑定

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

  (2)符号解析

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

  (3)程序加载

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

 

1.连接器

  (1)主要负责工作

    库查询、重定位、连接

  (2)重定位

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

    【1】重定位的发展

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

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

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

    【2】库与重定位  

      静态库

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

      动态库

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

  (3)两边连接

    (1)输入连接器的信息

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

      具体:

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

      【1】程序分段

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

      【2】符号表

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

    (2)第一次扫描

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

    (3)第二次扫描

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

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

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

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

转载于:https://www.cnblogs.com/yangxinrui/p/10991188.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值