文章目录

  • 前言
  • 一、预处理
    • 1.预处理阶段的操作:
    • 1.预处理过程实现:
  • 二、编译
    • 1.编译阶段的操作:
    • 2.编译过程的实现:
  • 三、汇编
    • 1.汇编阶段的操作:
    • 2.汇编过程的实现:
  • 四、链接
    • 1.链接阶段的操作:
    • 2.链接过程的实现:

前言

一个程序要运行,一定要经历四个步骤。依次是: 预处理、编译、汇编和链接。那么接下来就依次拆解这些过程来更好的理解程序是如何运行起来的。

首先简述一下各步骤的内容:

  • 预处理:展开头文件/宏替换/去掉注释/条件编译
  • 编译 :检查语法,生成汇编代码
  • 汇编:把汇编代码转成二进制机器码写入目标文件
  • 链接:链接各模块生成可执行程序

后面展开讨论————


一、预处理

1.预处理阶段的操作:

  1. 展开所有的宏定义,将#define删除
  2. 删除所有注释
  3. 保留所有的#pragma编译指令,因为编译器需要使用它们。
  4. 处理条件编译指令
  5. 处理#include预编译指令,将被包含的头文件插到该编译指令的位置
  6. 添加行号和文件标识名

1.预处理过程实现:

可以使用linux来实现预处理到链接的过程并观察

gcc指令的用法

-E选项:提示编译器执行完预处理就停下来,后边的编译、汇编、链接就先不执行了。
-S选项:提示编译器执行完编译就停下来,不去执行汇编和链接了。
-c选项:提示编译器执行完汇编就停下来。
使用 gcc 命令不跟任何的选项的话,会默认执行预处理、编译、汇编、链接这整个过程,如果程序没有错,就会得到一个可执行文件,默认为a.out,使用 -o + 文件名可定义生成可执行文件的名称。

一个简单的代码理解预处理


首先,编辑一个test.c文件,里面有注释,宏定义及预编译指令等,执行gcc -E test.c -o test.i,生成一个test.i文件。

观察发现,文件变成了900行左右,宏定义已经被替换掉了,注释等也已经删除。上面的部分即stdio.h包含的代码。

二、编译

1.编译阶段的操作:

编译过程是整个程序构建的核心部分,编译成功,会将源代码由文本形式转换成机器语言,编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析以及优化后生成相应的汇编代码文件。

2.编译过程的实现:

依然是上面的简单代码,针对生成的test.i文件执行gcc -S test.i -o test.s,生成一个test.s文件。

观察test.s文件,已经从之前的文本形式转换成汇编代码。

三、汇编

1.汇编阶段的操作:

汇编过程调用汇编器as来完成,是用于将汇编代码转换成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。

2.汇编过程的实现:

针对生成的test.s文件执行gcc -c test.s -o test.o,生成一个test.o文件。

文件将变成这样的只有机器才能看懂的语言啦。

四、链接

1.链接阶段的操作:

链接的主要内容就是将各个模块之间相互引用的部分正确的衔接起来。它的工作就是把一些指令对其他符号地址的引用加以修正。链接过程主要包括了地址和空间分配、符号决议和重定向。

2.链接过程的实现:

使用gcc test.o -o test指令,生成一个test文件

这就是链接后的文件,也是一个可执行程序,用./test执行

可以看到最终得到了答案。

C语言——程序的编译+链接(linux+gcc实现过程)相关推荐

  1. C语言程序的编译+链接详解

    文章目录 前言 一.引子 二.翻译环境 三.运行环境 总结 前言 同学们在写代码的时候,我们往往要先创建一个源文件比如test.c.写完具体代码并运行后,我们的文件夹中会生成一个test.exe的文件 ...

  2. C语言程序的编译+链接

    引入: 1.程序的翻译和执行环境 在ANSI C的任何一种实现中,存在两种不同的环境. 第一种是翻译环境,在这个环境中,源代码被转化为可执行的机器指令. 第二种是执行环境,它用于实际执行代码. < ...

  3. gcc编译c文件_Linux下C语言程序的编译过程

    Linux下C语言程序的编译过程 使用gcc编译程序时,编译工程分为4个阶段: (1)预处理:(Pre-Processing) (2)编译:(Compiling) (3)汇编:(Assembling) ...

  4. 在ubuntu系统下使用gcc和makefile实现c语言程序的编译运行

    目录 前言 一.使用gcc命令完成编译c语言程序 1.编写c语言程序 main1.c sub1.h sub1.c 2.gcc命令编译 步骤一命令:gcc -c sub1.c作用:将sub1.c程序转换 ...

  5. 一个c语言程序只要编译和链接没有错误,一个 C 语言程序只要编译和链接没有错误,程序运行结果就肯定正确...

    一个 C 语言程序只要编译和链接没有错误,程序运行结果就肯定正确 更多相关问题 网页表单中不能插入表格.() 要想在一个网页中嵌套另外一个网页,一般可以使用页内框架.() 贸易也是一种特殊的技术.() ...

  6. 《编译与反编译技术》—第1章1.7节C语言程序的编译流程

    本节书摘来自华章出版社<编译与反编译技术>一书中的第1章,第1.7节C语言程序的编译流程,作者庞建民,陶红伟,刘晓楠,岳峰,更多章节内容可以访问云栖社区"华章计算机"公 ...

  7. C语言程序makefile编译过程

    C语言程序makefile编译过程 2022-0111 blog_010 makefile是一些大型linux下开发的项目经常会用到的编译脚本: 可以将makefile理解为类似shell一样的脚本语 ...

  8. ubuntu搭建基于arm-none-eabi-gcc,jlink驱动的平台,并实现stm32f103c8t6程序的编译链接和烧写

    ubuntu搭建基于arm-none-eabi-gcc,jlink驱动的环境,并实现stm32f103c8t6程序的编译链接和烧写 说明: 本文内容基于VMware上的ubuntu虚拟机,vmware ...

  9. 使用gcc编译和链接C语言程序,用GCC编译链接程序--编译链接器GCC常用功能(菜鸟级)...

    转载自:http://daimajishu.iteye.com/blog/1089740 对gcc认识的一篇文章,就转载了,截取了自己感兴趣部分. 一,GCC编译器简介 虽然我们称Gcc是C语言的编译 ...

最新文章

  1. Manacher算法 , 实例 详解 . NYOJ 最长回文
  2. ajax判断用户名是否已经存在
  3. WinForm学习笔记(2)
  4. OpenGL 地形LOD的镶嵌细分的用法
  5. 顶级技术大咖,揭秘实时音视频开发的超级风口
  6. juery 常用方法
  7. html读mysql数据_html从数据库中读取数据
  8. android连接指定的wifi
  9. React Native常用组件之ListView组件
  10. 最新伯乐PHP个人在线自动发卡网源码V3.1版
  11. HTML前端数据管理,前端数据管理
  12. 硬盘文件系统系列之FAT
  13. C# 操作word之在表格中插入新行、删除指定行
  14. OutMan——Foundation框架中的NSDate类、NSCalendar类以及NSFileManager类
  15. 游戏建模:21个人脑壳雕刻小小技巧,非常有用
  16. Java实现网络通信(TCP程序设计)
  17. 梦想学院计算机,菲梦学院电脑版
  18. MySQL学习笔记04-DDL语句学习
  19. OpenCV 文字绘制cv::putText详解
  20. 用IntelliJ IDEA看Java类图

热门文章

  1. mysql的单行注释_MySQL基础--会这些就够了
  2. python库整理:heapq 最小堆
  3. MATLAB实战系列(三十三)-技术和医疗的完美结合(续),基于最小二乘法的椭圆拟合
  4. 以贴吧和头条为例,为什么产品都有极速版和标准版
  5. KMeans和KMedoid 的Matlab实现
  6. tf.where() 详解
  7. 如何求解问题--数据结构与算法入门
  8. Pandas处理Excel文件源码学习
  9. arcgis-shp文件属性表导出为dbf或txt
  10. 【机器学习PAI实践十二】机器学习实现男女声音识别分类(含语音特征提取数据和代码)