《深入理解计算机系统》第七章读书笔记

一、链接概述

1.链接

  1. 定义:链接是将各种数据和代码收集起来成并组合成为一个单一文件的过程(这个文件可以被拷贝到存储器并且执行)
  2. 场合:
    • 编译时:即源代码被翻译成机器代码
    • 加载时:程序被加载器加载到存储器并执行
    • 运行时
  3. 作用:
    • 使得分离编译成为可能(将大型应用程序分解为若干个小模块)

2.铺垫——编译驱动程序以及目标文件、符号表

编译驱动程序代表用户调用语言预处理器、编译器、汇编器和连接器

  1. 预处理器将.c文件翻译成ASCII码中间文件.i;
  2. 编译器将.i文件翻译成ASCII码汇编语言文件.s;
  3. 汇编器将.s文件翻译成可重定位目标文件.o;
  4. 链接器程序将.o文件以及一些必要的文件组合起来创建一个可执行目标文件;
  5. 加载器拷贝可执行文件代码和数据到存储器然后将控制转移到程序头

目标文件有三种形式:

  1. 可重定位目标文件
  2. 可执行目标文件
  3. 共享目标文件

3.静态链接

链接器的两个主要任务

  1. 符号解析:将每个符号引用刚好和一个符号定义联系起
  2. 重定位:链接器通过把每个符号定义与一个存储器位置联系起来

4.符号解析

  1. 对于那些和引用定义在相同模块的本地符号;编译器只允许每个模块中每个本地符号有一个定义
  2. 对于全局符号的解析
    • 当编译器遇到一个不是在当前模块中定义的符号时,它会假设该符号是在某个模块中定义的,生成一个链接器符号表条目然后交给链接器处理
    • 如果在链接器的任何模块中都找不到这个被引用的符号,它就输出一条错误信息然后终止
    • 对于多重定义的全局符号:
      • 函数和已经初始化的全局变量是强符号,未初始化的全局变量是弱符号
      • 规则:
        1. 不允许有多个强符号
        2. 如果有一个强符号和多个弱符号,那么选择强符号
        3. 如果有多个弱符号,那么从其中任选一个

5.重定位

重定位由两个步骤组成

  1. 重定位节和符号定义:链接器将所有相同类型的节合并为同一类型的新的聚合节
  2. 重定位节中的符号引用:链接器修改代码节和数据节中对每个符号的引用,使得它们指向正确的运行时的地址

重定位条目:

无论何时汇编器遇到对最终位置的目标引用,它就会生成一个重定位条目,告诉链接器将目标文件合并成可执行文件的时候如何修改这个引用

6.与静态库连接

  1. 概述:编译系统提供一种机制,将所有相关的目标模块打包为一个单独的文件,称为静态库,它可以用做链接器的输入
  2. 优点:
    • 相关的函数可以被编译为独立的目标模块,然后封装成一个单独的静态库文件
    • 链接器只拷贝被引用程序引用的目标模块,这就减少了可执行文件在磁盘和存储器中的大小

7.加载可执行文件

  1. 加载器将可执行目标文件中的代码和数据从磁盘拷贝到存储器中,然后通过跳转到程序的第一条指令来运行程序
  2. 每个Unix程序都要加一个运行时存储器映像

 

posted @ 2016-04-07 19:47  小阿小阿俊  阅读(185)  评论(0编辑  收藏  举报