GCC 编译分为四个过程 举例hello.c 的编译过程
#include<stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
(1)预处理 gcc -E hello.c -o hello.i
省略了部分内容,包括stdio.h中的一些声明及定义
预编译过程主要处理那些源代码中以#开始的预编译指令,主要处理规则如下:
l 将所有的#define删除,并且展开所有的宏定义;
l 处理所有条件编译指令,如#if,#ifdef等;
l 处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。该过程递归进行,及被包含的文件可能还包含其他文件。
l 删除所有的注释//和 /**/;
l 添加行号和文件标识,如#2 “hello.c” 2,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号信息;
l 保留所有的#pragma编译器指令,因为编译器须要使用它们;
2.编译 gcc -S hello.i -o hello.s
编译过程就是把预处理完的文件进行一系列词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件。
(介绍一个将可执行文件转换为汇编文件的方法
Arm-linux-objdump –D elf_file > dis_file或者
Arm-linux-objdump –D –b binary –m arm bin_file > dis_file
)3.汇编 gcc -c hello.s -o hello.o
汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可。
4.链接 gcc hello.o -o hello
链接器ld将各个目标文件组装在一起,解决符号依赖,库依赖关系,并生成可执行文件。