《深入理解计算机系统》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. Django的cookie和session

    http://www.cnblogs.com/lhj588/archive/2011/10/27/2226976.html

  2. gulp顺序执行任务

    gulp的任务的执行是异步的. 所以,当我写完一系列的任务,准备一股脑地执行. # gulp.task('prod', ['clean', 'compass', 'image', 'style', ' ...

  3. ubifs总体设计分析

    1.     设计需求 flash设备区别与一般的块设备,有如下特点: 存在坏块 使用寿命较短 存储介质不稳定 读写速度慢 不支持随机访问(nand) 只能通过擦除将0改成1 最小读写单位为page ...

  4. ACM 过河问题

    过河问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:5   描述 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边.如果不借助手电筒的话,大家是无论如何也不敢过桥去的 ...

  5. [Java] 利用LinkedHashMap来实现LRU Cache

    http://www.acmerblog.com/leetcode-lru-cache-lru-5745.html https://oj.leetcode.com/discuss/1188/java- ...

  6. jQuery自定义滚动条样式插件mCustomScrollbar

    如果你构建一个很有特色和创意的网页,那么肯定希望定义网页中的滚动条样式,这方面的 jQuery 插件比较不错的,有两个:jScrollPane 和 mCustomScrollbar. 关于 jScro ...

  7. MongoDB 用户配置

    ====[安装]====DOS下切换到文件所在盘符 例如 D:\MongoDB\bin设置数据库保存位置 mongod.exe --dbpath D:\MongoDB\Data [--auth]//用 ...

  8. (转)KeyDown、KeyUp、KeyPress区别

    Windows窗体通过引发键盘事件来处理键盘输入以响应Windows消息,大多数Windows窗体应用程序都通过处理键盘事件来以独占方式处理键盘输入. 1.按键的类型 Windows窗体将键盘输入标 ...

  9. 【Go语言】LiteIDE使用的个人使用方法

    Go语言开发 可以使用的IDE很多 (Goclipse,sublime,notepad++,vim等)目前使用的最顺手的就是LiteIDE了 但是尽管这样,一开始使用LiteIDE也有很多不习惯的地方 ...

  10. jquery 的datatables插件问题

      翻页后js失效: 重绘事件-当表格重绘完成后 重新绑定事件: draw.dt $('#example').dataTable(); $('#example').on( 'draw.dt', fun ...