《深入理解计算机系统》CHAPTER7阅读梳理

【学习时间:3hours】

【学习内容:链接需要的代码&数据;链接机制;链接生成的目标文件】

一、链接概述

1.链接

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

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

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

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

目标文件有三种形式:

  1. 可重定位目标文件

    • 包括如下内容
      • ELF头:描述文件系统的字的大小和字节顺序,ELF头的大小,目标文件类型,机器类型等
      • 节:.text已编译程序的机器代码,.data&.bss分别是已初始化和未初始化的变量,.symtab一个符号表存放在程序中定义和引用的全局变量信息
        • 符号表中三种不同的符号:

          1. 由本模块定义并被其他模块引用的全局符号(即不带static的全局变量)
          2. 由其他模块定义并被本模块引用的全局符号(即定义在其他模块中的C函数变量)
          3. 只被本模块定义和引用的本地符号
          4. 另外,本地程序非静态变量不在符号表中,它们在运行时在栈中被管理;编译器把初始化为0的变量放在.bss而非.data中
      • 节头部表:描述目标文件的节
  2. 可执行目标文件
    • 包括如下内容:
      • ELF头部:描述总体格式,包括程序的入口点也就是程序运行的时候要执行的第一条指令
      • 段头部表:描述可执行文件连续片和存储器段的映射关系
      • 其他
  3. 共享目标文件(特殊的可重定位目标文件)

3.静态链接

链接器的两个主要任务

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

4.符号解析

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

5.重定位

重定位由两个步骤组成

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

重定位条目:

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

6.与静态库连接

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

7.加载可执行文件

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

《Linux内核分析》第七周 读书笔记的更多相关文章

  1. linux内核分析 第七周读书笔记

    第七章 链接 1.链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载到存储器并执行. 2.链接可以执行于编译时,加载时,运行时. 7.1编译器驱动程序 1.大多数编译系统 ...

  2. Linux内核分析第七周学习笔记——Linux内核如何装载和启动一个可执行程序

    Linux内核分析第七周学习笔记--Linux内核如何装载和启动一个可执行程序 zl + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study. ...

  3. Linux内核分析——第七周学习笔记20135308

    第七周 可执行程序的装载 一.预处理.编译.链接和目标文件的格式 1.可执行程序是怎么来的 C代码—>预处理—>汇编代码—>目标代码—>可执行文件 .asm汇编代码 .o目标码 ...

  4. linux内核分析 第六周读书笔记

    第三章 进程管理 3.1 进程 进程:处于执行期的程序 线程是在进程活动中的对象:内核调度的对象是线程而不是进程,在Linux系统中,并不区分线程和进程 在现代操作系统中, 进程提供两种虚拟机制:虚拟 ...

  5. linux内核分析 第八周读书笔记

    第四章 进程调度 4.1 多任务 1.多任务操作系统就是能同时并发的交互执行多个进程的操作系统. 2.多任务操作系统使多个进程处于堵塞或者睡眠状态,实际不被投入执行,这些任务尽管位于内存,但是并不处于 ...

  6. linux内核分析 第五周读书笔记

    第18章 调试 内核调试的难度大于用户级 一.准备开始 开始之前需要的是: 一个行为可靠且定义明确的bug 一个隐匿bug的内核版本 相关内核代码的知识和运气 想要成功的调试,取决于能不能将这些bug ...

  7. LINUX内核分析第七周学习总结:可执行程序的装载

    LINUX内核分析第七周学习总结:可执行程序的装载 韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/cours ...

  8. Linux内核分析第四章 读书笔记

    Linux内核分析第四章 读书笔记 第一部分--进程调度 进程调度:操作系统规定下的进程选取模式 面临问题:多任务选择问题 多任务操作系统就是能同时并发地交互执行多个进程的操作系统,在单处理器机器上这 ...

  9. Linux内核分析 第七周 可执行程序的装载

    张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核分析 第七 ...

  10. LINUX内核分析第七周学习总结

    LINUX内核分析第七周学习总结 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.c ...

随机推荐

  1. SQL SERVER获取数据库中所有表名 XTYPE类型

    SELECT (case when a.colorder=1 then d.name else null end) 表名, a.colorder 字段序号,a.name 字段名,  (case whe ...

  2. rJava包---R与Java的接口

    1.安装 版本说明:Win10+R3.2.5+JKD1.7+eclipse-jee-mars-R-win32-x86_64 install.packages("rJava") 2. ...

  3. ACM ICPC 2015 Moscow Subregional Russia, Moscow, Dolgoprudny, October, 18, 2015 A. Anagrams

    A. Anagrams time limit per test 1 second memory limit per test 512 megabytes input standard input ou ...

  4. BZOJ2679 : [Usaco2012 Open]Balanced Cow Subsets

    考虑折半搜索,每个数的系数只能是-1,0,1之中的一个,因此可以先通过$O(3^\frac{n}{2})$的搜索分别搜索出两边每个状态的和以及数字的选择情况. 然后将后一半的状态按照和排序,$O(2^ ...

  5. ACM 交换输出

    交换输出 时间限制:3000 ms  |  内存限制:65535 KB 难度:1   描述 输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数.(如果这个第一个数就是最 ...

  6. 【BZOJ1951】【SDOI2010】古代猪文 Lucas定理、中国剩余定理、exgcd、费马小定理

    Description “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边 ...

  7. 你用java的swing可以做出这么炫的mp3播放器吗?

    这个mp3播放器是基于java的swing编写的,我认为界面还是可以拿出来和大家看一看评一评. 先说说创作的初衷,由于前段时间工作不是很忙,与其闲着,还不如找一些东西来给自己捣腾捣腾,在 之前写的 j ...

  8. Node.js的高性能封装 Express.js

    Express 是一个简洁而灵活的 node.js Web应用框架, 提供一系列强大特性帮助你创建各种Web应用.Express 不对 node.js 已有的特性进行二次抽象,我们只是在它之上扩展了W ...

  9. sublime text 3 package control

    使用Ctrl+`快捷键或者通过View->Show Console菜单打开命令行,粘贴如下代码: import urllib.request,os; pf = 'Package Control. ...

  10. html5 canvas画图之图形随拖动而复制(有操作指示)

    学习html5 canvas,写了一个小练习来加深理解,可以实现图形随拖动而复制. <!DOCTYPE html> <html> <head> <meta c ...