C++ 编译链接
简单说下总体流程:读取源程序——预处理——编译——汇编——链接。

- 预处理器先处理各种宏定义,然后交给编译器;
- 编译器编译成.s为后缀的汇编代码;
- 汇编代码再通过汇编器形成.obj/.o机器码(二进制);
- 最后通过链接器将一个个目标文件(库文件/.obj/.o)链接成一个完整的可执行程序(或者静态库、动态库)。
1.1 预处理
预处理阶段:
- 宏#define。将所有的#define删除并展开所有的宏。
- 条件编译指令,如#ifdef,#ifndef,#else,#elif,#endif等。
- 头文件包含,#include。将包含的文件插入到预编译的文件中
- 过滤所有的注释符号。
- 添加行号和文件标识。方便再编译器产生调试用的行号信息等。
- 特殊符号(不必深究什么符号)
1.2 编译
1.2.1 预编译
- 编译程序所要作得工作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其
翻译成等价的汇编语言。
1.2.2 优化
优化一部分是对中间代码的优化。这种优化不依赖于具体的计算机。主要的工作是删除公共表达式、循环优化(代码外提、强度削弱、变换循环控制条件、已知量的合并等)、复写传播,以及无用赋值的删除等。另一种优化则主要针对目标代码的生成而进行的。同机器的硬件结构密切相关,最主要的是考虑是如何充分利用机器的各个硬件寄存器存放的有关变量的值,以减少对于内存的访问次数。另外,如何根据机器硬件执行指令的特点(如流水线、RISC、CISC、VLIW等)而对指令进行一些调整使目标代码比较短,执行的效率比较高。
1.3 汇编
把汇编语言代码翻译成目标机器指令,生成目标文件(.o/.obj文件,都是二进制文件)。此过程会依赖机器的硬件和操作系统环境。- .o文件至少需要提供三张表
- 导出符号表: 即该目标文件可以提供的符号及地址
- 未解决符号表:即找不到地址的符号的列表,告诉链接器这些符号没找


2万+

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



