GCC学习笔记(一)

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

前言

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

预编译
HelloWorld.c
HelloWorld.i

在此阶段,gcc使用预编译器,对代码进行预编译,预编译后,gcc将拷贝头文件,宏替换文字的替换,条件编译等操作。可以查看helloWorld.i文件预编译后的文件内容,包含了大量的extern,一些结构、一些枚举等。

2.GCC -S选项:生成汇编文件
gcc -S HelloWorld.i -o HelloWorld.s

汇编
HelloWorld.i
HelloWorld.s

在此阶段gcc主要使用的gcc的汇编器,对C语言的代码进行汇编指令阶段,很长的C程序被会变成了较短汇编代码。
在这里插入图片描述

3.GCC -c选项:只编译不链接,仅生成目标文件
gcc -c HelloWorld.s -o HelloWorld.o

编译
HelloWorld.s
HelloWorld.o

此阶段的意义:在正常的程序开发阶段,由于不同工程的.c文件不止一个,单个.c文件直接链接到最终的可执行文件的情况较少,所以设置此阶段作为链接文件前的缓冲。

4.GCC -o选项:指定输出文件
gcc HelloWorld.o -o HelloWorld

链接
HelloWorld.s
HelloWorld

最后阶段gcc将使用连接器(ld)将所有的.o文件链接到一起,重新定位他们的数据的位置。

至此我们生成了可执行文件HelloWorld
总体流程如下图所示:

预编译
汇编
编译
链接
HelloWorld.c
HelloWorld.i
HelloWorld.s
HelloWorld.o
HelloWorld

备注: 最终生成的文件是.elf格式,最终生成的文件名是HelloWorld.elf

编译保留中间文件

可以直接使用参数-save-temps保留中间生成的文件进行编译。
具体指令:gcc -save-temps HelloWorld.c - o HelloWorld
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值