CSAPP第七章笔记

      • 1本章主要讲什么
      • 2本章看后有何好处
      • 本章的难点在哪里

1、本章主要讲什么?

以我所见,一个程序的生是从源代码编辑而开始,经历编译,汇编、链接一系列的形态转换变成可执行文件,死是在执行完毕后被终止。我认为本章主要讲程序的链接(link)部分,首先将程序的编译作为引子,然后集中篇幅讲链接:

  • 静态链接(符号解析与静态库链接重定位

讲完链接之后,接着讲加载(load),但是加载不是最重要的,而是第二重要的,其中包括了动态链接部分,所以这一章的主题是链接

2、本章看后有何好处?

作者列出了4大好处来诱惑我们看本章:

  1. 理解连接器将帮助你构造大型程序(个人体会:在Windows下开发程序,尤其容易出现缺少dll文件的事情,以及链接时出现的无法解析的外部符号等错误)
  2. 理解链接器将帮助你避免一些危险的编程错误(个人理解:多个未初始化的全局变量而出现的问题,就是后面所谓的弱符号问题)
  3. 理解链接器将帮助你理解语言作用域规则是如何实现的(个人体会:链接器只关心全局符号和static符号,不关心局部变量,局部变量是栈的事情)。
  4. 理解链接器将帮助你理解其他重要的系统概念(比如加载和运行程序,虚拟存储器,分页和存储器映射)
  5. 理解链接器将使你能够利用共享库(so、dll文件)

对我而言,这一章阅读并理解之后,可以更加清楚程序从#include开始到a.out(.exe)的过程:

Created with Raphaël 2.1.0 开始 预处理(.c--.i) 编译(.i--.s) 汇编(.s--.o) 链接(.o--a.out or .obj--.exe) 输出(a.out or *.exe)
预处理

程序:预处理器(cpp)
输入: .c文件
输出:.i文件(Linux)
简述:将.c文件中的.h文件插入到到.c文件中,以及宏替换,原来的.c文件会得到大大的扩张,但是对人来说,.i文件是可以用文本编辑器打开阅读的。

编译

程序:预处理器(ccl)
输入: .i文件
输出:.s文件(Linux)
简述:将源文件翻译成汇编代码,此时对人来说,虽然晦涩了点,但是勉强还能读,也可以用文本编辑器打开阅读。

汇编

程序:预处理器(as)
输入: .s文件
输出:.o文件(Linux)或.obj(Windows PE)—统称目标文件
简述:此时汇编代码变成二进制的机器码,对于绝大多数人来说看不懂的,除非芯片设计的专家级人物,如果强行用用文本编辑器打开阅读,只会看见你看不懂的乱码,不信你就试试(VS的工程里有不少这样的文件)

链接

程序:链接器(linker)
输入: .o文件和静态库文件
输出:a.out文件(Linux)、.exe(Windows PE)、elf文件(Linux)或库文件(静态和动态)
简述:终于到了万里长征倒数第二步。也是最关键的一步,前面那么多铺垫,最终汇流到这里。这一步绝非易事,难点在于符号解析重定位,由此引申出了静态库动态库技术。这一步为每一个符号连上一个实际的存储地址,为加载器指明道路。

加载

程序:加载器(loader)
输入: elf, .exe 文件
输出:进程
简述:这才是万里长征最后一步,这一步包括了不少内容,如线程的开辟,虚拟地址空间,地址映射,动态加载动态库等,但这不是本章的主要内容。

本章的难点在哪里

我个人觉得是符号解析重定位,总感觉尊敬的两位作者在这里描述了个大概,看了几遍都觉得没讲透。作者在章末也说链接记录过程没有详细的文献可以参考,只能得到大概的面貌。

话虽如此,但是后续我将继续整理符号解析重定位的知识,以我的理解来描写。

你可能感兴趣的:(CSAPP读书笔记)