0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

GCC编译C语言程序的过程是怎么样的

Wildesbeast 来源:算法集市 作者:算法集市 2020-02-18 11:47 次阅读

使用GCC将C语言源代码文件生成可执行文件的过程,需要经历四个的步骤:

预处理(Preprocessing)

编译(Compilation)

汇编(Assembly)

链接(Linking)

1、预处理(Preprocessing)

将C源程序预处理,生成.i文件。

预处理过程实质上是处理“#”,将#include包含的头文件直接拷贝到.c当中;将#define定义的宏进行替换;将#if #else #endif定义的无用代码过滤掉,同时将代码中没用的注释部分删除等。

预处理所完成的基本上是对源程序的“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,但内容有所不同。

2、编译(Compilation)

预处理后的.i文件编译为汇编语言,生成.s文件。

编译所要作的工作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。

3、汇编(Assembly)

将.s文件经过汇编,生成.o目标文件。

汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程。对于被翻译系统处理的每一个C语言源程序,都将最终经过这一处理而得到相应的目标文件。目标文件中所存放的也就是与源程序等效的目标的机器语言代码。

目标文件由段组成。通常一个目标文件中至少有两个段:

代码段:该段中所包含的主要是程序的指令。该段一般是可读和可执行的,但一般却不可写。

数据段:主要存放程序中要用到的各种全局变量或静态的数据。一般数据段都是可读,可写,可执行的。

4、链接(Linking)

将.o文件链接起来生成一个可执行文件。

链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。

根据库函数不同的链接方式,链接处理可分为静态链接和动态链接两种。使用静态链接的好处是,依赖的动态链接库较少,具有较好的兼容性;缺点是生成的程序比较大。使用动态链接的好处是,生成的程序比较小,占用较少的内存。

C语言中静态库和动态库简介

需要注意的是,.i文件、.s文件、.o文件可以认为是中间文件或临时文件,若使用 GCC 一次性完成C语言程序的编译,那么只能看到最终的可执行文件,这些中间文件都是看不到的,因为 GCC 已经将它们删除了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7591

    浏览量

    135770
  • GCC
    GCC
    +关注

    关注

    0

    文章

    105

    浏览量

    24802
收藏 人收藏

    评论

    相关推荐

    单片机hex文件反编译C语言过程

    使用C语言编写,然后编译成机器码并烧录到单片机的存储器中。 Hex文件是一种用于存储单片机程序的文件格式,它包含了程序的机器码和一些附加信息
    的头像 发表于 09-02 10:49 1953次阅读

    linux驱动程序编译方法有哪两种

    Linux驱动程序编译方法主要可以归纳为两种: 手动编译 和 使用内核构建系统(Makefile)自动编译 。 1. 手动编译 手动
    的头像 发表于 08-30 14:39 437次阅读

    嵌入式学习-常用编辑器之GCC编译

    ;汇编:将汇编语言翻译成二进制文件;链接:将汇编出来的多个二进制目标文件和库文件进行链接,生成可执行文件。我们可以通过一个简单的hello.c程序编译
    发表于 08-27 10:17

    常用编辑器之GCC编译

    ,输出结果是一的。elf@ubuntu:~/work/example/hello$ gcc hello.c4、GCC编译
    发表于 08-24 11:05

    C语言:嵌入式开发中的关键编译器角色

    嵌入式程序开发跟硬件密切相关,需要使用C语言来读写底层寄存器、存取数据、控制硬件等,C语言和硬件之间由
    发表于 04-26 14:53 502次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>:嵌入式开发中的关键<b class='flag-5'>编译</b>器角色

    C语言#define的应用

    C/C++ 编程语言中,当程序编译时,被发送到编译器,
    发表于 03-06 11:29 330次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>#define的应用

    嵌入式Linux C语言编程程序调试与宏定义

    在Linux使用gcc编译程序的时候,对于调试的语句还具有一些特殊的语法。gcc编译过程中,会生成一些宏,可以使用这些宏分别打印当前源文件
    发表于 03-01 11:41 839次阅读

    运行c程序的基本步骤

    运行C程序的基本步骤可以分为以下四个主要步骤:编写程序编译程序、链接程序和运行程序。本文将详细
    的头像 发表于 11-27 16:21 5255次阅读

    c程序的运行环境和运行c程序的方法

    C语言是一种通用的、高效的编程语言,被广泛用于系统开发、嵌入式设备以及科学计算等领域。为了正确运行C程序,我们需要了解
    的头像 发表于 11-27 16:00 1930次阅读

    c语言hello world程序编写

    语言"Hello world"程序的编写过程,并提供一些实用技巧和注意事项。 首先,我们需要一个C语言开发环境来编写和运行代码。在这里,我们
    的头像 发表于 11-26 09:23 2177次阅读

    如何把c语言程序变成应用程序

    C语言程序转变为应用程序可以分为以下几个步骤:编写源代码、编译、链接和运行。在这篇文章中,我将详细介绍这些步骤以及相关的工具和技术。 第
    的头像 发表于 11-26 09:04 3269次阅读

    c语言编写的源程序可以直接运行吗

    C语言编写的源程序不能直接运行,必须经过一系列的编译链接过程才能生成可执行文件,然后才能运行。 C
    的头像 发表于 11-26 09:03 6544次阅读

    为什么C语言要进行编译

    为什么我们编写的C语言要进行编译?什么是编译编译时发生了什么? 机器无法理解我们编写的C
    的头像 发表于 11-24 15:47 1190次阅读
    为什么<b class='flag-5'>C</b><b class='flag-5'>语言</b>要进行<b class='flag-5'>编译</b>

    c语言程序main函数的位置

    理解C语言程序的执行过程C语言程序的执行
    的头像 发表于 11-24 10:23 2238次阅读

    C程序的完整编译过程

    本文讨论了C程序的完整编译过程,分别讲述了预处理、编译、汇编、链接各阶段完成的编译任务。然后通过
    的头像 发表于 11-15 17:14 2696次阅读
    <b class='flag-5'>C</b><b class='flag-5'>程序</b>的完整<b class='flag-5'>编译</b><b class='flag-5'>过程</b>