被隐藏了的过程
集成开发环境: Build:编译+链接
GCC编译Hello World程序
$gcc hello.c $./a.out
预处理(Prepressing)
编译(Compilation)
汇编(Assembly)
链接(Linking)
预编译
$gcc -E hello.c -o hello.i
- 预编译预测主要处理的那些源代码文件中 以 # 开始的编译指令.
- 将所有 #define 删除,展开宏定义
- 处理所有条件编译指令
- 删除所有注释
- 添加行号和文件名标识
- 保存所有 #pragma 编译指令,编译器要使用它们
编译
$gcc -S hello.i -o hello.s
- 编译过程就是把预处理完的文件进行一系列语法分析 词法分析 语义分析 以及优化后生产相应的汇编代码文件.
汇编
$gcc -c hello.s -o hello.o
- 汇编器是将汇编代码转换为机器可以执行的指令
- 汇编指令和机器指令一一翻译
链接
编译器做了什么
编译器就是将高级语言翻译成机器语言的一个工具.
- 词法分析
- 语法分析
- 语义分析
- 中间语言生成
- 目标代码生成与优化
静态链接(模块拼装)
链接的主要内容就是把各个模块之间的相互引用的部分处理好.使得各个模块之间能够正确的链接.
链接过程主要包括
地址和空间分配
符号决议
名称决议/符号绑定/名称绑定
决议:更倾向于静态链
绑定:更倾向于动态链接重定位