前言
GCC是GNU工具链的集合,包含编译器、汇编器、链接器、解释器等。由于日程使用了集成编译开发环境,所以对编译的过程不是那么了解,遇到问题不知道从何处进行分析,故有撰写此文章的目的。
阅读本文章的前置条件需要了解gcc以及比较简单的gcc操作。
GCC工作的流程
gcc编译器在编译过程之中大致经历以下几个阶段,预编译、汇编、编译、链接,下文将以helloWorld为例介绍,helloWorld.c是如何编程最终的helloWorld.elf文件的,用的指令是什么,每一步会使用gcc工具链的哪些器件。
示例:
HelloWorld.c文件内容:
#include <stdio.h>
void main(void)
{
printf("Hello World!\n");
}
使用指令
gcc HelloWorld.c -o HelloWorld
最终生成可执行文件HelloWorld。
在直接使用gcc编译文件时,删除了很多临时文件,不利于理解gcc的工作流程,故可以使用指令编译的每一部分实例化,方便理解gcc的工作方式。
1.GCC -E选项:生成预处理文件
gcc -E HelloWorld.c -o HelloWorld.i
在此阶段,gcc使用预编译器,对代码进行预编译,预编译后,gcc将拷贝头文件,宏替换文字的替换,条件编译等操作。可以查看helloWorld.i文件预编译后的文件内容,包含了大量的extern,一些结构、一些枚举等。
2.GCC -S选项:生成汇编文件
gcc -S HelloWorld.i -o HelloWorld.s
在此阶段gcc主要使用的gcc的汇编器,对C语言的代码进行汇编指令阶段,很长的C程序被会变成了较短汇编代码。

3.GCC -c选项:只编译不链接,仅生成目标文件
gcc -c HelloWorld.s -o HelloWorld.o
此阶段的意义:在正常的程序开发阶段,由于不同工程的.c文件不止一个,单个.c文件直接链接到最终的可执行文件的情况较少,所以设置此阶段作为链接文件前的缓冲。
4.GCC -o选项:指定输出文件
gcc HelloWorld.o -o HelloWorld
最后阶段gcc将使用连接器(ld)将所有的.o文件链接到一起,重新定位他们的数据的位置。
至此我们生成了可执行文件HelloWorld。
总体流程如下图所示:
备注: 最终生成的文件是.elf格式,最终生成的文件名是HelloWorld.elf
编译保留中间文件
可以直接使用参数-save-temps保留中间生成的文件进行编译。
具体指令:gcc -save-temps HelloWorld.c - o HelloWorld

本文是GCC学习笔记的第一部分,介绍了GCC的工作流程,包括预编译、汇编、编译和链接四个阶段,并通过helloWorld.c示例详细解析了每个阶段的输出文件。还讲解了如何使用特定选项保留编译过程中的中间文件,以帮助理解GCC的工作方式。
3946

被折叠的 条评论
为什么被折叠?



