一,预处理:gcc test.c -E -o test.i
1.将所有的#define删除,并展开所有的宏定义;
2.处理所有的预编译指令,例如:#if,#elif,#else,#endif;
3.处理#include预编译指令,将被包含的文件插入到预编译指令的位置;
4.添加行号信息文件名信息,便于调试;
5.删除所有的注释:// /**/;
6.保留所有的#pragma编译指令,因为在编写程序的时候,我们经常要用到#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作。
生成.i文件。
二、编译:C语言——》汇编 gcc test.i -S-o test.s 变成汇编语言保存在test.s中
1.扫描,语法分析,语义分析,源代码优化,目标代码生成,目标代码优化;
2.生成汇编代码;
3.汇总符号;
4.生成.s文件
三、汇编:汇编——》二进制 gcc test.s -c-o test.o test.o是二进制文件
1.根据汇编指令和特定平台,把汇编指令翻译成二进制形式;
2.合并各个section,合并符号表;
3.生成.o文件
四、链接 gcc test.o -o a.out 生成a.out可执行文件
1.合并各个.obj文件的section,合并符号表,进行符号解析;
2.符号地址重定位;
3.生成可执行文件
-D 在编译的时候定义宏。
-I 制定头文件路径。
-g gdb调试的时候需要添加参数。
-O 编译优化,3个等级 -O(1-3).
-Wall 编译期间输出警告信息。