编译过程:

- 预编译。展开所有 # define 和条件 define 相关定义, 以及 # include 包含的文件[递归],删除注释、添加行号和文件名。 产生 .i 文件
- 编译[最核心]。 产生汇编语言代码 .s 文件。
- 汇编。 将汇编代码翻译成二进制 .o 文件。
- 链接。把各个模块之间的相互引用关系处理好,符号地址的引用。 主要是:地址和空间分配,符号决议,重定位。
引用其他模块的函数或者全局变量时不需要知道他们的地址,链接器会修正编译器产生的指令目标地址。
代码被编译&汇编成机器文件后, 指令常被放在代码段中, 即 .code & .text section, 全局变量和局部静态变量数据放在数据段中,即 .data section

代码段和数据段分开的好处:
- 指令是只读的,而数据是可读可写的。
- 空间局部性原理,利于性能。
- 由于指令是只读的,所以多个进程共用相同的DDL时,内存中只有一份代码段指令。
本文详细介绍了编译过程的五个主要阶段:预编译、编译、汇编、链接及它们的功能,包括如何处理宏定义、包含文件、生成汇编代码、创建目标文件以及解决模块间的引用关系。

被折叠的 条评论
为什么被折叠?



