从源代码到可执行文件共经历四个步骤: 1.预处理 预处理是在程序源代码被编译之前,由预处理器对程序源代码进行的处理。这个过程并不对程序的源代码进行解析,但它把源代码分割或处理成为特定的符号用来支持宏调用。
gcc –E test.c –o test.i
扩展源代码,插入所有用#include命令的指定的文件,并扩展多有用#define声明指定的宏。
2.编译 编译是执行词法分析语法分析等检查后将高级语言转换为汇编代码;gcc –S test.i –o test.s 或 gcc –S test.c –o test.s
编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生成相应的汇编代码文件。
将test.i翻译成test.s,它包含一个汇编语言程序,汇编语言程序中的每条语句都以一种标准的文本格式确切地描述了一条低级机器语言指令。
3.汇编 汇编是将编译生成的汇编代码转换成机器代码即二进制代码(目标代码)as test.s –o test.o 或 gcc –c test.s –o test.o 或gcc –c test.c –o test.o
汇编器将test.s翻译成机器语言指令(字节编码),打包成可重定位的目标文件test.o,它是一个二进制目标文件。
4.链接 链接的作用是将多个目标代码同库文件进行连接最终生成可执行程序。 将目标代码文件与实现库函数的代码合并,并产生最终的可执行代码文件test。这四个步骤分别生成.cpp、.s、.o/.obj和ELF文件。 example.c原文件:
- int g(int x)
- {
- return x+3;
- }
- int f(int x)
- {
- return g(x);
- }
- int main(void)
- {
- return f(8)+1;
- }