预处理器、编译器、汇编器、链接器
从源文件到可执行文件
考虑两个源文件。
main.c
int sum(int *a, int n);
int aray[2] = {1, 2};
int main()
{
int val = sum(array, 2);
return val;
}
sum.c
int sum(int *a, int n)
{
int i, s = 0;
for(i = 0; i < n; i++){
s += a[i];
}
}
如上图。驱动程序依次执行以下步骤:
首先,运行C预处理器(cpp),将C的源程序main.c翻译成一个ASCII码的中间文件main.i;
接下来,运行C编译器(ccl),将main.i翻译成一个ASCII码的汇编语言文件main.s;
然后,运行汇编器(as),将main.s翻译成一个可重定位目标文件main.o;
经过上述三个步骤生成sum.o;
最后,运行链接器(ld),将main.o和sum.o以及一些必要的系统文件组合起来,创建一个可执行目标文件prog。
各阶段的功能如下:
预处理主要用于C语言编译器对各种预处理命令进行处理,包括对头文件的包含、宏定义的扩展、条件编译的选择等。例如,对# include指示的处理结果,就是将对应.h文件的内容插入到源程序文件中。
编译会先对源程序进行词法分析、语法分析和语义分析,然后根据分析的结果进行代码优化和存储分配,最终会把C语言源程序翻译成汇编语言程序。
汇编的功能是将编译生成的汇编语言代码转换为机器语言代码。
链接的功能是将所有关联的可重定位目标文件组合起来,以生成一个可执行文件。
ref:https://blog.csdn.net/qq_39918677/article/details/120372053