编译一个C语言程序是一个多阶段的过程。从总体上看,这个过程可以分成四个独立的阶段。预处理、编译、汇编和连接。

在这篇文章中,我将逐一介绍编译下列C程序的四个阶段。

/** "Hello, World!": A classic.*/#include <stdio.h>int main(void){puts("Hello, World!");return 0;}

预处理

编译的第一个阶段称为预处理。在这个阶段,以#字符开头的行被预处理器解释为预处理器命令。这些命令形成一种简单的宏语言,有自己的语法和语义。这种语言通过提供内联文件、定义宏和有条件地省略代码的功能,来减少源代码的重复性。

在解释命令之前,预处理器会做一些初始处理。这包括连接续行(以 \ 结尾的行)和剥离注释。

要打印预处理阶段的结果,请向gcc传递-E选项。

gcc -E hello_world.c

考虑到上面的 "Hello, World!"的例子,预处理器将产生stdio.h头文件的内容和hello_world.c文件的内容,并将其前面的注释剥离出来。

编译

编译的第二个阶段被称为编译,令人困惑。在这个阶段,预处理过的代码被翻译成目标处理器架构特有的汇编指令。这些形成了一种中间的人类可读语言。

这一步骤的存在允许C代码包含内联汇编指令,并允许使用不同的汇编器。

一些编译器也支持使用集成汇编器,在这种情况下,编译阶段直接生成机器代码,避免了生成中间汇编指令和调用汇编器的开销。

要保存编译阶段的结果,可以向gcc传递-S选项。

gcc -S hello_world.c

这将创建一个名为hello_world.s的文件,包含生成的汇编指令。

汇编

在这个阶段,汇编器被用来将汇编指令翻译成目标代码。输出包括目标处理器要运行的实际指令。

要保存汇编阶段的结果,请向gcc传递-c选项。

gcc -c hello_world.c

运行上述命令将创建一个名为hello_world.o的文件,包含程序的目标代码。这个文件的内容是二进制格式,可以用运行命令hexdump或od来检查。

hexdump hello_world.ood -c hello_world.o

Linux中的od(octal dump)命令用于转换输入内容为八进制。

Hexdump是一个命令行工具,用于以各种方式显示文件的原始内容,包括十六进制,可用于Linux、FreeBDS、OS X和其他平台。Hexdump不是传统Unix系统或GNU命令的一部分。

链接

汇编阶段产生的目标代码是由处理器能够理解的机器指令组成的,但程序的某些部分是不符合顺序的或缺失的。为了产生一个可执行的程序,现有的部分必须被重新排列,并把缺失的部分补上。这个过程被称为链接。

链接器将安排目标代码的各个部分,使某些部分的功能能够成功地调用其他部分的功能。它还将添加包含程序所使用的库函数指令的片段。在 "Hello,world!"程序的例子中,链接器将添加puts函数的对象代码。

这一阶段的结果是最终的可执行程序。当不使用选项运行时,gcc 将把这个文件命名为 a.out。如果要给文件命名,请向 gcc 传递 -o 选项。

gcc -o hello_world hello_world.c

参考:

The Four Stages of Compiling a C Program https://www.calleluks.com/the-four-stages-of-compiling-a-c-program/

https://en.wikibooks.org/wiki/Hexdumphttps://en.wikibooks.org/wiki/Hexdump

C语言编译的四个步骤相关推荐

  1. c语言编译四个步骤,gcc编译的四个步骤

    以最简单的hello.c为例子 一步到位:gcc hello.c 这条命令隐含执行了 (1)预处理 (2)编译 (3)汇编 (4)链接 这里未指定输出文件,默认输出为a.out gcc编译C源码有四个 ...

  2. linux下gcc编译的四个步骤,linux:gcc编译程序的四个阶段

    gcc的编译流程分为四个步骤,分别为: 预处理(Pre-Processing) 编译(Compiling) 汇编(Assembling) 链接(Linking) gcc指令的一般格式为:gcc [选项 ...

  3. c语言编译的四个阶段

    总结:(源文件名为loops.c) 可以转换到不同阶段.阶段1,将头文件加进来.阶段2,转换成汇编程序,与机器类型相关.阶段3,转换成机器码,但不完整.阶段4,链接其他系统文件,形成最终可执行文件 c ...

  4. 【Linux】编译的四个步骤

    目录 平常的使用: 安装软件 编写:vi/vim vscode 编译 执行 路径/文件名 计算机五大部件 编译四步 1.预编译(处理#) 2.编译(查错,代码到汇编) 3.汇编(汇编到二进制指令) 4 ...

  5. (四)Go 语言编译流程简述

    一.概述 Go 语言编译的最后一个阶段是根据 SSA 中间代码生成机器码,这里谈的机器码是在目标 CPU 架构上能够运行的二进制代码,中间代码生成一节简单介绍的从抽象语法树到 SSA 中间代码的生成过 ...

  6. linux下gcc编译c文件生成可执行文件的四个步骤

    Linux下gcc编译c文件为可执行文件分为四个步骤: 分别是 预编译.编译.汇编.链接. 1.预编译( 生成 hello.i 文件) 预编译的处理规则: 1. 将所有的 "#define& ...

  7. 5分钟读懂c语言编译步骤

    编写的C/C++代码,通过ide生成一个可执行文件,我们只需要点一下编译就可以实现,但实际上,我们点下编译之后,编译器经历了很多步骤,才最终生成了我们需要的软件. 在早期没有ide或者在Linux上我 ...

  8. C语言编译链接生成可执行文件四大步骤:预处理(-E)->编译(-S)->汇编(-c) ->链接

    文章目录 一.编译过程简介 1.预处理器 2.编译器 3.汇编器 二.链接过程简介 1.静态链接: 由链接器在链接时将库的内容直接加入到可执行程序中 2.动态链接: 一.编译过程简介 编译过程可以分为 ...

  9. gcc可以编译python程序吗_gcc c语言编译流程

    1 前言 最近群里讨论个C语言的小程序,看起来都不是很难,但是大家对答案有争论,所以想讨论编译原理,做嵌入式要对编译原理有一定的了解,所以转了这篇文章. 我们之前讨论的问题如下代码 #include ...

最新文章

  1. HP笔记本 CQ41全系列系统解决方案
  2. ES5新增的方法——数组的方法
  3. 为防止员工带薪拉屎,快手公司推出“计时厕所”?官方称只是为了测试!
  4. php 计划任务 curl,通过Task Scheduler定时运行调用cURL的PHP脚本 | 学步园
  5. 在datatable中,在指定位置插入列
  6. python 判断类是否存在某个属性或方法
  7. 为了适应云数据库mySQL产品_为了适应不同的应用场景,云数据库mysql版提供的产品系列包括哪些...
  8. 自定义view圆环的改变
  9. Mac电脑优化工具箱MacCleaner PRO
  10. excel透视表(pivot table)
  11. CityEngine--comp() operator
  12. Asterisk内核 拾遗
  13. java中view是什么_深入理解Android中View
  14. 获取当前时间的东八区时间
  15. 建瓯最坏的YARA - APT | 病毒检测 | 常用模块和字段
  16. 微信小程序——修改radio组件的大小
  17. 可穿戴式柔性电子应变传感器基底材料
  18. PDPS软件:导出AutoCAD可编辑的2D布局图
  19. 手动部署java jar包
  20. python生成ppt报告_python 生成 pptx 分析报告的工具包:reportgen

热门文章

  1. H5 table表格中td和th设置不了宽度,min-width,max-width无用
  2. apache drill mysql_Apache Drill嵌入式安装
  3. 江苏徐州市“十三五”能源发展规划发布
  4. Oracle PL/SQL开发基础(第三十弹:预定义异常)
  5. 银行理财、保险、证券销售双录系统解决方案
  6. 寒春:2013年2月的RSA Conference与硅谷
  7. PTA - 数据库合集26
  8. 模型质量控制管理2——提高精度解决模型非实体不封闭破面等问题
  9. String Hashing - 字符串哈希化
  10. 掌握自动化部署,拿下DevOps半壁江山还远吗?