C语言之编译和链接

目录

一、引言 

二、编译和链接

2.1 预处理(预编译)

2.2 编译

2.3 汇编

2.4 链接


一、引言 

#include <stdio.h>
int main()
{
    printf("hello, world\n");
    return 0;
}

像这样,只由ASCII字符构成的文件被称为文本文件,它需要经过翻译环境的编译和链接后才能成为二进制文件,也就是可执行程序。

可执行程序的内部是一系列二进制形式的计算机指令和数据的集合,CPU可以直接识别,但是对于程序员来说非常难以记忆和使用,所以程序员开发出了编程语言,使用这些语言来编写程序。

为了要运行环境中运行编写出来的程序,每条C语句都必须在翻译环境中被其他程序转化为一系列的汇编指令,然后这些指令按照格式打好包,并以二进制磁盘文件的形式存放起来。

在ANSI C的任何一种实现中,存在两个不同的环境

  • 翻译环境,在这个环节中源代码被转换成可执行的机器指令
  • 执行环境,用于实际执行代码

翻译环境是由编译链接两个过程组成的,而编译又可以细分为预处理(预编译)、编译和汇编三个过程

二、编译和链接

在一个项目中可能同时存在多个.c文件,这些文件经过编译器处理编译出对应的目标文件,再和链接库一起经过链接器处理生成最终的可执行程序

2.1 预处理(预编译)

在预处理阶段,源文件和头文件会被处理成以 .i 为后缀的文件

我们用gcc编译器观察一下对 test.c 文件预处理后的 .i 文件,在终端输入以下指令:

gcc -E test.c -o test.i

预处理阶段主要处理源文件中以#为开头的预编译指令,例如#include,#define,处理的规则如下

(1)将所有的#define删除,并展开所有的宏定义

图中我们可以观察到,在 test.i 中#define指令已经被删除,M也被替换成了100

(2)处理所有的条件编译指令,如 #if ,#ifdef,#elif,#else,#endif

(3)处理 #include 预编译指令,将包含的头文件的内容插入到该预编译指令的位置。这个过程是递归进行的,也就是说被包含的头文件也可能包含其他头文件

(4)删除所有的注释

(5)添加行号和文件名标识,方便后续编译器生成调试信息等

(6)保留所有的 #pragma 编译器指令,因为后续编译器会用到

2.2 编译

编译器将预处理完的 .i 文本文件进行一系列的词法分析、语法分析、语义分析和优化,编译成以 .s 为后缀的汇编代码文件。汇编过程的命令如下:

gcc -S test.i -o test.s

汇编代码文件大概长这样:

假设有代码如下,编译过程该如何对其进行分析呢?

array [index] = (index+ 4 )*( 2 + 6 );

编译过程可分为6步:扫描(词法分析)、语法分析、语义分析、源代码优化、代码生成、目标代码优化。

(1)词法分析

将源代码程序输入扫描器中,扫描器将其中的字符序列分割成一系列的记号。上面的代码进行词法分析后得到了16个记号:

记号类型
array标识符
[左方括号
index标识符
]右方括号
=赋值
(左圆括号
index标识符
+加号
4数字
)右圆括号
*乘号
(左圆括号
2数字
+加号
6数字
)右圆括号

(2)语法分析

接下来,语法分析器将对扫描器生成的记号进行语法分析,产生语法树。

(3)语义分析

语义分析器对表达式进行语法层面分析。编译器所能做的分析是语义的静态分析。静态语义分析通常包括声明和类型的匹配,类型转换等。这个阶段会报告错误的语法信息

2.3 汇编

汇编器将汇编代码翻译成机器可执行的指令,每一条汇编语句几乎都对应一条机器指令。在这一步中,只是根据汇编指令和机器指令的对照表一一的进行翻译,不做指令优化

汇编会生成 .o 为后缀的目标文件,命令如下:

gcc -c test.s -o test.o

汇编后的目标文件就已经是二进制形式了,我们很难阅读

2.4 链接

目标文件在经过链接之后才能称为可执行文件。既然目标文件和可执行文件都是二进制格式,为什么还要再链接一次呢?

因为编译只是将我们自己写的代码变成了二进制格式,它还需要和标准库、动态链接库等结合起来,这些组件都是程序运行所必须的。

链接过程主要包括地址和空间分配,符号决议和重定位等步骤,解决的是一个项目中多文件、多模块之间互相调用的问题。

完.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/333464.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于人工蚁群、蚁群、遗传算法的多目标任务分配

matlab2020a可运行 基于人工蚁群、蚁群、遗传算法的多目标任务分配资源-CSDN文库

数据结构--串

本文为复习的草稿笔记&#xff0c;&#xff0c;&#xff0c;有点乱 1. 串的基本概念和基本操作 串是由零个或多个字符组成的有限序列 2. 串的存储结构 3.串的应用 模式匹配 BF算法&#xff08;简单匹配算法 穷举法 算法思路&#xff1a;从子串的每一个字符开始依次与主串…

【大数据】Flink 测试利器:DataGen

Flink 测试利器&#xff1a;DataGen 1.什么是 FlinkSQL &#xff1f;2.什么是 Connector &#xff1f;3.DataGen Connector3.1 Demo3.2 支持的类型3.3 连接器属性 4.DataGen 使用案例4.1 场景一&#xff1a;生成一亿条数据到 Hive 表4.2 场景二&#xff1a;持续每秒生产 10 万条…

FunTester 性能测试中获取 JVM 资源信息

在以往性能测试中&#xff0c;通常施压机的硬件资源不会成为压力瓶颈&#xff0c;但是在多任务并行的场景中&#xff0c;如果一个任务占用当前机器资源过多&#xff0c;会影响其他任务执行。或者当前用例本身存在问题&#xff0c;导致性能无法进一步提升&#xff0c;影响了性能…

鸿蒙开发系列教程(四)--ArkTS语言:基础知识

1、ArkTS语言介绍 ArkTS是HarmonyOS应用开发语言。它在保持TypeScript&#xff08;简称TS&#xff09;基本语法风格的基础上&#xff0c;对TS的动态类型特性施加更严格的约束&#xff0c;引入静态类型。同时&#xff0c;提供了声明式UI、状态管理等相应的能力&#xff0c;让开…

脏牛漏洞(CVE-2016-5195)复现过程(详细完整版)

1、实验环境 KaLi 攻击机 Linux靶机 靶场 实验目的&#xff1a; 掌握漏洞利用的方法 掌握脏牛漏洞的原理 提高对内核安全性的认识 2、靶场搭建 VMware导入靶场 靶场地址&#xff1a;链接&#xff1a;百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。…

SEO品牌推广的核心步骤

在当今数字化的商业环境中&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;品牌推广已经成为企业不可或缺的一部分。通过优化网站&#xff0c;提高在搜索引擎结果中的排名&#xff0c;企业能够更好地吸引潜在客户&#xff0c;提升品牌知名度。本文将专心分享如何做好SEO品…

线性表的顺序存储实现

前言 线性表的顺序存储及基本操作的实现 一、线性表 线性表&#xff08;List&#xff09;是由同类型数据元素构成有序序列的线性结构&#xff0c;用户处理线性表数据时常常需要初始化、查找、插入、删除、计算数据长度等操作。 线性表还包含以下几个要素&#xff1a; 表中元…

C语言编译和链接

翻译环境和运行环境 在ANSI C的任何一种实现中&#xff0c;存在两个不同的环境 .第一种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令 .第二种是执行环境&#xff0c;它用于实际执行代码 翻译环境 翻译环境是由编译和链接两个大过程组成&#xff0c;而…

交叉编译工具 aarch64-linux-gnu-gcc 的介绍与安装

AArch64 是随 ARMv8 ISA 一起引入的 64 位架构&#xff0c;用于执行 A64 指令的计算机。而且在 AArch64 状态下执行的代码只能使用 A64 指令集。&#xff0c;而不能执行 A32 或 T32 指令。但是&#xff0c;与 AArch32 中不同&#xff0c;在64位状态下&#xff0c;指令可以访问 …

ArcGIS Pro控件汇总

控件来源 我们对其一一进行查看是否有控件 查看位置 控件展示 ribbonControls 展示 代码 <controls:ProWindow x:Class"ProAppModule9.ProWindowRibbon"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:controls"clr-…

集成学习算法(Bagging 思想、Boosting思想)及具体案例

概述&#xff1a;是机器学习中的一种思想&#xff0c;通过多个模型的组合形成一个精度更高的模型&#xff0c;参与组合的模型称为弱学习器 1、Bagging 思想 有放回的抽样&#xff08;booststrap抽样&#xff09;产生不同的训练集&#xff0c;从而训练不同的学习器&#xff1b;…

FairGuard游戏安全2023年度报告

导 读&#xff1a;2023年&#xff0c;游戏行业摆脱了疫情带来诸多负面影响&#xff0c;国内游戏市场收入与用户规模双双实现突破&#xff0c;迎来了历史新高点。但游戏黑灰产规模也在迅速扩大&#xff0c;不少游戏饱受其侵扰&#xff0c;游戏厂商愈发重视游戏安全问题。 为帮助…

重磅发布!基于百度飞桨的《人工智能基础及应用》书籍正式上线

科技日新月异的今天&#xff0c;人工智能已经成为引领未来的核心驱动力。为了帮助大家更好地深入理解人工智能的理论和技术&#xff0c;为未来发展做好准备&#xff0c;百度飞桨教材编写组联合北京交通大学王方石教授、北京邮电大学杨煜清特聘副研究员共同撰写推出了《人工智能…

使用 FFmpeg 轻松调整视频的大小/缩放/更改分辨率

在此 FFmpeg 教程中&#xff0c;我们学习使用 FFmpeg 的命令行工具更改视频的分辨率&#xff08;或调整视频的大小/缩放&#xff09;。 更改视频的分辨率&#xff08;也称为调整大小或缩放&#xff09;是视频编辑、处理和压缩中非常常见的操作。对于 ABR 视频流尤其如此&#…

【笔记】Helm-3 主题-6 Chart仓库指南

Chart仓库指南 本节介绍如何创建和使用chart仓库。在高层级中&#xff0c;chart仓库是打包的chart存储和分享的位置。 社区的Helm chart仓位于 Artifact Hub &#xff0c;欢迎加入。不过Helm也可以创建并运行您自己的chart仓库。该指南将介绍如何操作。 Artifact Hub 先决条…

防爆气象站需要如何维护

TH-FBCQX2 在工业生产中&#xff0c;防爆气象站是保障安全生产的重要设备之一。由于其特殊的使用环境和功能&#xff0c;防爆气象站的维护保养工作显得尤为重要。 一、日常维护保养 清洁&#xff1a;防爆气象站的外部和内部组件需要定期清洁&#xff0c;以去除灰尘、油渍和杂质…

快速入门:搭建宠物用品小程序商城的必备知识

小程序商城逐渐成为商家展示和销售产品的重要渠道。对于宠物用品商家来说&#xff0c;搭建一个宠物用品小程序商城不仅可以提高品牌知名度&#xff0c;还能吸引更多的潜在客户。本文将介绍如何通过乔拓云平台搭建宠物用品小程序商城。 首先&#xff0c;商家需要登录乔拓云平台后…

GaussDB与openGauss有什么相同和不同?

众所周知&#xff0c;GaussDB是华为自主创新研发的分布式关系型数据库&#xff0c;为企业提供功能全面、稳定可靠、扩展性强、性能优越的企业级数据库服务&#xff0c;openGauss是开源数据库&#xff0c;两者之间又是什么样的关系&#xff0c;有什么相同和不同&#xff0c;让我…

Git教程学习:03 记录每次更新到仓库

文章目录 1 检查当前文件状态2 跟踪新文件3 暂存已修改的文件4 状态简览5 忽略文件6 查看已暂存和未暂存的修改7 提交更新8 跳过使用暂存区域9 移除文件10 移动文件 现在我们的机器上有了一个 真实项目 的 Git 仓库&#xff0c;并从这个仓库中检出了所有文件的 工作副本。 通常…