c语言编译系统内部的工作原理
程序生命周期概述
一个程序的生命周期可以被分成四个部分:
- 创建
- 编译
- 运行
- 退出
以一个简单的 helloworld.c 程序为例:
#include<stdio.h>
int main()
{
printf("hello world!");
return 0;
}
编译的详细过程
通过这条命令
gcc -o helloworld helloworld.c
即可完成对 helloworld.c 的编译,生成可执行程序 hello
这是我们最常使用的编译手段(gcc)
看似很简单,一个命令就能把源码编译成了可执行程序。
实际上,编译的过程可以细分为四个步骤
-
预处理(Pre-processor)(cpp)
-
编译(Compiler)(ccl)
-
汇编(Assembler)(as)
-
链接(Linker)(ld)
预处理
预处理器会根据以#开头的代码段,来修改原始程序
如:helloworld.c 程序中引入头文件——stdio.h
预处理器会读取其中的内容,将其中的内容直接插入到源程序中,最终得到另外一个c程序
经过预处理器处理后得到的文件通常以 .i 结尾
编译
经过词法分析、语法分析、语义分析、优化等步骤,把c语言程序翻译成汇编程序
对于编译阶段,c语言文件 helloworld.i 经过编译得到输出文件 helloworld.s
汇编
汇编器根据指令集 将汇编程序 helloworld.s 翻译成机器指令,并且把这一系列的机器指令按照固定的规则进行打包
汇编语言文件 helloworld.s 经过汇编后得到 可重定位目标文件helloworld.o
此时,helloworld.o 虽然是一个二进制文件,但是还不能执行
链接
编译器负责把多个可重定位目标文件根据一定规则进行合并
在 helloworld.c 这个程序中,我们调用了 printf 函数(标准c库中的函数),这个 printf 函数在名为 printf.o 的文件中(一个提前编译好的目标文件)
链接器负责把 helloworld.o 和 printf.o 进行合并
最终,经过链接得到可执行文件 helloworld ,此时得到的 helloworld 文件就可以被加载到内存中去执行了
标签:文件,语言,程序,helloworld,编译,printf,原理,编译系统 From: https://www.cnblogs.com/endermanneer/p/18177161