GCC编译过程

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编译器具体编译过程如下图所示:
在这里插入图片描述

图1 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

(完)