学习笔记
第8章 从源文件到可执行文件
本章问题:

问题
本章重点:
编译器的功能;程序从源代码到可执行文件的流程;程序运行时的堆和栈。
8.1 计算机只能运行本地代码

一个例子1

一个例子2
图中栗子的源代码文件命名为Sample1.c。

源代码需要转换成本地代码才能运行
8.2 本地代码的内容
直接用记事本打开本地代码:

记事本打开本地代码
把本地代码Dump一下,每一个字节用2位16进制数(每个16进制数代表4位二进制数,2位16进制数恰好代表8位即1字节)来表示:

本地代码的真是面目是数值的罗列
8.3 编译器负责转换源代码
- 不同的语言有各自的编译器;
- 不同类的CPU有不同的机器语言,需要不同的编译器;
- 编译器也是应用程序,也需要运行环境;
- 存在交叉编译器,在某一环境下运行,可以生成另一环境下的本地代码。

通过命令行编译上面的栗子
8.4 仅靠编译是无法得到可执行文件的
- 编译生成的是.obj文件(目标文件),而不是.exe文件,无法直接运行;
- 如果源代码中引用了其它的函数(如上面例子中的sprintf()、MessageBox()),就需要把储存着这些函数的目标文件与此目标文件相结合;
- 完成此工作的是链接器,最后生成.exe文件

链接上面的栗子
8.5 启动及库文件
- 在链接的命令中,c0w32.obj记述的是同所有程序起始位置相结合的处理内容,称为程序的启动,即使未调用其它目标文件的函数,也必须要进行链接,并和启动结合起来;
8.6 DLL文件及导入库
8.7 可执行文件运行时的必要条件
8.8 程序加载时会生成堆和栈
8.9 有点难度的Q&A
问题答案:

答案