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语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144635
  • GCC
    GCC
    +关注

    关注

    0

    文章

    112

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C语言和单片机C语言有什么差异

    成汇编语言机器才能读懂,所以每个平台的编译编译成对应平台汇编的程序,每个平台的汇编不一,当然编译
    发表于 11-14 07:55

    蜂鸟E203能够仿真运行C语言程序吗?

    我看那两本书里面都是说怎么在FPGA上运行C语言程序和Benchmark程序,它提供仿真器下如何编译运行
    发表于 11-06 06:21

    如何利用 gcc 编译Ccode?

    最近在玩e203_hbirdv2,利用默认的case 可以仿真。现在想自己写C code 进行仿真,请问该如何利用 gcc 编译?有没有 详细的教程。
    发表于 11-05 12:37

    RISC-V的工具链GCC内联汇编

    内联汇编操作。这里我们可以用前后各带下划线的关键词asm。 2.关键词“volatile”是可选的。如果在使用的过程中添加此关键词,则要求编译器对后续括号内添加的汇编程序不进行任何优化以保持其原状;如果没有
    发表于 10-30 06:59

    在Linux系统下编译C语言仿真蜂鸟E203(二)

    的可执行文件如下图所示,使用的编译工具为riscv-nuclei-elf-gcc 每次编译程序时,需要 source setup.sh文件,将gcc的路径环境加载进来
    发表于 10-24 13:38

    飞凌嵌入式ElfBoard-Vim编辑器之GCC的基本使用

    程序编译过程GCC的整个编译过程有一个简单的了解。1)预处理elf@ubuntu:~/wor
    发表于 10-16 09:05

    飞凌嵌入式ElfBoard-Vim编辑器之GCC编译器的安装

    GCC(GNU Compiler Collection)是由GNU开发的编程语言编译器,最初是作为GNU操作系统的编译器编写的。GCC是一个
    发表于 10-15 08:44

    GCC编译器,怎么才能实现c文件中未被调用的函数,不会被编译呢?

    GCC编译器,怎么才能实现c文件中未被调用的函数,不会被编译?有什么编译选项可以设置吗? 移植代码,有些函数没被调用的函数想留在代码里,但不
    发表于 09-28 12:25

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

    C语言编程中,循环结构是至关重要的,它可以让程序重复执行特定的代码块,从而提高编程效率。然而,为了避免程序进入无限循环,C
    的头像 发表于 04-29 18:49 1740次阅读
    深入理解<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 1089次阅读
    FPGA Verilog HDL语法之<b class='flag-5'>编译</b>预处理

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

    在本教程中,我将讨论C编程语言是什么,C编程的用途,以及如何在RaspberryPi上编写和运行C程序。本文的目的是为您介绍在Raspber
    的头像 发表于 03-25 09:28 942次阅读
    如何在 树莓派 上编写和运行 <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 1475次阅读

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

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

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

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