CSAPP第七章笔记

来源:互联网 发布:淘宝上为啥不卖电视棒 编辑:程序博客网 时间:2024/05/17 20:33

      • 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 文件
输出:进程
简述:这才是万里长征最后一步,这一步包括了不少内容,如线程的开辟,虚拟地址空间,地址映射,动态加载动态库等,但这不是本章的主要内容。

本章的难点在哪里

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

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

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 超级寻宝仪 地动仪 宙斯美容仪 眼部按摩仪 心电监护仪显示器图解 测亩仪 洗脸仪 陀螺仪有什么用 无仪宁死三部曲 浑天仪 测距仪app 水平仪哪个牌子好 补水仪 理疗仪 refa美容仪 多参数监护仪 有始无终无仪宁死 八礼四仪内容 露娜洁面仪 美牙仪 无仪宁死 按摩仪 扫描 扫描仪 扫描仪价格 扫描器 扫描机 扫描仪价钱 骨盆修复仪做完10次有效果吗 丁雪萍受精仪后续出国txt 汉仪南宫体 表面等离子体共振仪 体控电疗仪 智能体脂仪 体控电疗仪多少钱一台 纤体仪 体脂仪多少钱 体脂仪价格 汉仪菱心体简 体脂测量仪