我们基本都知道一个程序由代码行再到最后被执行生成目标文件,会经历四个过程: 1:预编译(Prepressing) 2.编译(Compilation) 3.汇编(Linking)4.链接(Assembly) 但其中每个步骤都发生了什么,还是不太清楚,今天我们就来学习了解下这个过程.
一.预编译.(假设原文件是.c文件 .c------> .i文件)
linux命令(gcc -E test.c -o test.i 或者 cpp test.c > test.i // test.i代表处理生成的.i文件程序名)
预编译主要处理那些源代码文件中以"#"的预编译指令.如"#define" "#include".
1.#define定义的标识符替换,#define定义的宏也会发生替换.或者直接说#define的删除,并展开宏定义.
2.处理"#include"预编译指令,将包含的头文件插到该预编译指令的位置,该过程是递归的.
3.处理所有条件预编译指令,比如"#if ","#endif","else","#elif". 注意#pragma pack(8)设置默认对齐数在这个阶段不会进行语法检查.
4注释的替换删除 将注释替换成了空格.
二.编译(生成 .s文件-->由汇编代码组成)
Linux命令(gcc -S test.i -o test.s)
1.语法检查
2.语法分析(生成语法树)
3.语义分析
4.符号汇总
三.汇编 (生成 .o文件->生成机器可识别代码 objcode 也称为目标文件)
linux命令(gcc -c test.s -o test.o