gcc编译过程
几乎每个程序员接触到的第一个程序都是“hello world”,其代码如下:
#include <stdio.h>
int main()
{
printf("Hello World\r\n");
retrun 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
我们在使用C-Free只要点一下编译运行,控制台就会出现“Hello World”。然而机器并不会C语言,他是怎么执行这条语句的呢?其实IDE在点编译的时候已经为我们做了很多事了。如果接触过Linux开发,在入门教程的的时候,一定安装过GCC编译器,同样的代码放在hello.c文件中。若要打印出"Hello World"需要输入两个命令,操作也十分简单。但实际上C语言已经被翻译了很多次才变成最后的可执行文件。
$ gcc hello.c
$ ./a.out
Hello World
- 1
- 2
- 3
C语言到机器识别的可执行文件,经历了4个过程:预编译、编译、汇编、链接
GCC编译器具体编译过程如下图所示:
预编译
hello.c和stdio.h文件会通过预编译指令生成一个hello.i文件。其指令如下:
$ gcc -E hello.c -o hello.i
- 1
预编译过程中做以下几件事:
1.处理“#”开头的东西,如#include、#define、#if、#endif……
2.删除所有//和/* */,也就是把注释删了
3.添加行号和文件名标识
4.保留所有#pragram编译器指令
所以.i文件中所有的宏定义都会被替换
编译
编译的作用是把预编译的文件按照词法分析、语法分析、语义分析和优化生成汇编代码文件。
其指令如下:
$ gcc -S hello.i -o hello.s
- 1
汇编
汇编就是把汇编代码转换成机器可执行的指令,照着表格翻译就行了,输出目标文件。
其指令如下:
$gcc -c hello.s -o hello.o
- 1
链接
链接顾名思义就是将多个目标文件链接起来生成最后一个a.out文件。其实现过程比较复杂,之后会有一个专门的篇幅来描述链接。(之后送上传送门)
以上内容参考《程序员的自我修养》一书,将自己学习到的知识整理出来。只是用来分享所学知识无商业用途。若理解错误还希望大佬指出,欢迎大家留言交流。
文章来源: blog.csdn.net,作者:柒妖71,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq_39854159/article/details/115035752