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

    文章

    7513

    浏览量

    124113
  • GCC
    GCC
    +关注

    关注

    0

    文章

    104

    浏览量

    24700
收藏 人收藏

    评论

    相关推荐

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

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

    为什么C语言要进行编译

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

    c语言程序main函数的位置

    理解C语言程序的执行过程。 C语言程序的执行过程可以简单概括为以下几个步骤: 扫描源代码:在
    的头像 发表于 11-24 10:23 726次阅读

    C程序的完整编译过程

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

    CH32V307编译过程分析

    (IDE)对RISC-V MCU进行嵌入式开发时,工程师不用关注RISC-V MCU 繁杂的底层编译过程,只需用C语言编写相应的工程代码,点击build
    发表于 09-15 14:32

    Linux 下GCC编译

    一、Linux 下多文件编译 在上一篇 Linux 下的 C 编程我们知道了 Linux 下的编译器为 GCC ,以及如何使用 GCC 进行编译
    的头像 发表于 09-11 15:18 1016次阅读
    Linux 下<b class='flag-5'>GCC</b>的<b class='flag-5'>编译</b>

    gcc、glibc、arm-linux-gcc之间有哪些联系?

    The GNU Compiler Collection,通常简称 GCC,是一套由 GNU 开发的编译器集,为什么是编辑器集而不是编译器呢?那是因为它不仅支持 C 语言
    的头像 发表于 09-04 11:47 1212次阅读

    RISC-V MCU编译过程分析

    1、前言 使用MounRiver Studio(MRS)这款集成开发环境(IDE)对RISC-V MCU进行嵌入式开发时,工程师不用关注RISC-V MCU 繁杂的底层编译过程,只需用C语言
    发表于 08-30 14:29

    C语言编译链接过程

      C语言编译链接过程要把我们编写的一个C程序源代码转换成可以在硬件上运行的程序(可执行代码),需要进行
    的头像 发表于 08-21 10:06 1520次阅读
    C<b class='flag-5'>语言</b>的<b class='flag-5'>编译</b>链接<b class='flag-5'>过程</b>

    Linux的gcc编译过程介绍

    工作中,在Linux环境下,有过量产项目的公司,gcc一般都是已经安装好了的。如果需要安装,请从官网下载或网上找资源下载
    发表于 07-14 15:50 333次阅读
    Linux的<b class='flag-5'>gcc</b><b class='flag-5'>编译</b><b class='flag-5'>过程</b>介绍

    CW32 搭建VSCODE+GCC交叉编译环境

    在win10下面创建vscode+gcc开发武汉芯源CW32L系列MCU的编译环境
    的头像 发表于 06-28 17:02 2.4w次阅读
    CW32 搭建VSCODE+<b class='flag-5'>GCC</b>交叉<b class='flag-5'>编译</b>环境

    C语言编译过程

    C语言编译链接过程要把我们编写的一个C程序源代码,转换成可以在硬件上运行的程序(可执行代码),需要进行
    发表于 06-25 10:36 277次阅读
    C<b class='flag-5'>语言</b>的<b class='flag-5'>编译</b><b class='flag-5'>过程</b>

    Linux使用gcc编译程序的语法

    01. 调试相关的宏 在Linux使用gcc编译程序的时候,对于调试的语句还具有一些特殊的语法。 gcc编译过程中,会生成一些宏,可以使用
    的头像 发表于 06-22 10:51 350次阅读

    Linux程序编译过程分析

    大家肯定都知道计算机程序设计语言通常分为机器语言、汇编语言和高级语言三类。高级语言需要通过翻译成机器语言
    的头像 发表于 05-12 14:55 331次阅读
    Linux<b class='flag-5'>程序</b><b class='flag-5'>编译</b><b class='flag-5'>过程</b>分析

    Linux内核中常用的C语言技巧有哪些

    Linux内核采用的是GCC编译器,GCC编译器除了支持ANSI C,还支持GNU C。在Linux内核中,许多地方都使用了GNU C语言
    的头像 发表于 05-12 14:45 383次阅读