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

    文章

    7633

    浏览量

    142144
  • GCC
    GCC
    +关注

    关注

    0

    文章

    111

    浏览量

    25513
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    深入理解C语言C语言循环控制

    C语言编程中,循环结构是至关重要的,它可以让程序重复执行特定的代码块,从而提高编程效率。然而,为了避免程序进入无限循环,C
    的头像 发表于 04-29 18:49 ?1242次阅读
    深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:<b class='flag-5'>C</b><b class='flag-5'>语言</b>循环控制

    C语言的历史及程序介绍

    电子发烧友网站提供《C语言的历史及程序介绍.pdf》资料免费下载
    发表于 04-09 16:10 ?0次下载

    FPGA Verilog HDL语法之编译预处理

    Verilog HDL语言C语言也提供了编译预处理的功能。“编译预处理”是Verilog
    的头像 发表于 03-27 13:30 ?665次阅读
    FPGA Verilog HDL语法之<b class='flag-5'>编译</b>预处理

    如何在 树莓派 上编写和运行 C 语言程序

    在本教程中,我将讨论C编程语言是什么,C编程的用途,以及如何在RaspberryPi上编写和运行C程序。本文的目的是为您介绍在Raspber
    的头像 发表于 03-25 09:28 ?648次阅读
    如何在 树莓派 上编写和运行 <b class='flag-5'>C</b> <b class='flag-5'>语言</b><b class='flag-5'>程序</b>?

    Triton编译器支持的编程语言

    Triton编译器支持的编程语言主要包括以下几种: 一、主要编程语言 Python :Triton编译器通过Python接口提供了对Triton语言
    的头像 发表于 12-24 17:33 ?1013次阅读

    Triton编译器与其他编译器的比较

    的GPU编程框架,使开发者能够编写出接近手工优化的高性能GPU内核。 其他编译器 (如GCC、Clang、MSVC等): 定位:通用编译器,支持多种编程语言,广泛应用于各种软件开发场景
    的头像 发表于 12-24 17:25 ?1054次阅读

    Triton编译器功能介绍 Triton编译器使用教程

    Triton 是一个开源的编译器前端,它支持多种编程语言,包括 CC++、Fortran 和 Ada。Triton 旨在提供一个可扩展和可定制的
    的头像 发表于 12-24 17:23 ?1773次阅读

    分享关于编译器的科普

    ? Clang和GCC的主要区别如下所示: Clang比GCC编译用的时间更短,包括预处理、语法分析、解析、语义分析、抽象语法树生成的时间。 Clang比GCC的内存占用更小。 Cla
    的头像 发表于 12-09 09:49 ?596次阅读

    C语言生成可执行二进制文件的具体过程

    C语言源码到生成可执行文件的过程通常包括预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)、链接(Linking)等多个步骤,每个步骤都有其
    的头像 发表于 10-21 14:30 ?1687次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>生成可执行二进制文件的具体<b class='flag-5'>过程</b>

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

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

    hex文件如何查看原c语言代码

    直接将 .hex 文件转换回原始的 C 语言代码是不可能的,因为 .hex 文件是二进制文件,它包含了单片机程序编译后的机器码,这些机器码与原始的
    的头像 发表于 09-02 10:37 ?5089次阅读

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

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

    RK3568 编译sdk技巧

    我司RK3568对外提供源代码是以sdk的形式提供,包括但不仅限于uboot、kernel、buildroot、debian源码。在编译sdk的过程中往往需要安装大量的第三方安装包,同时也要保证宿主
    的头像 发表于 08-30 11:44 ?1133次阅读
    RK3568 <b class='flag-5'>编译</b>sdk技巧

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

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

    常用编辑器之GCC编译

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