编译和链接(小白初理解)

news2025/7/10 6:26:05

目录

1. 翻译环境和运⾏环境

 1.2翻译环境

2. 翻译环境:预编译+编译+汇编+链接

2.1预处理(预编译)阶段 

2.2编译 

2.2.1词法分析 

2.2.2语法分析 

2.2.3语义分析 

 2.3 汇编

2.4 链接

 3. 运⾏环境


1. 翻译环境和运⾏环境

翻译环境指的是:这个环境中讲我们输入的代码转换为机器可以执行的指令

执行环境指的是:就是用来执行代码的,程序的样子。

 1.2翻译环境

 翻译环境是由编译和链接这两个过程组成的,在编译中,还有三个小过程

预处理(有些书也叫预编译)、编译、汇编三个过程。

 

 一个c项目会有多个.c 文件一起构建处理,那么那么多 .c 怎么生成的可执行程序呢?

1. 多个 .c 文件经过编译会先生成对应的 .o 文件。

2.在Windows环境下的⽬标⽂件的后缀是.obj,Linux环境下⽬标⽂件的后缀是.o

3.多个.0文件 和链接库 被链接器处理最后形成可执行程序。

4.链接库是指运⾏时库(它是⽀持程序运⾏的基本函数集合)或者第三⽅库。

将编译展开成三个过程后 :

2. 翻译环境:预编译+编译+汇编+链接

2.1预处理(预编译)阶段 

 这个阶段中,.c 和.h文件都被处理为.i 为后缀的文件。

在gcc 中可以观察这阶段的特点命令如下:

gcc -E test.c -o test.i

 预处理阶段主要处理那些源⽂件中#开始的预编译指令。⽐如:#include,#define,处理的规则如下:

1. 将所有的#define 删除,将定义好的宏内容,替换 代码中 的位置。

2.处理所有的编译条件指令如: #if#ifdef#elif#else#endif

#if #elif #endif 和 if语句的用法相似,就是 if else if 类似,但需要用 #endif 来结束#if 的语句。不然不会编译。

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

4.删除所有的注释

5.添加⾏号和⽂件名标识,⽅便后续编译器⽣成调试信息等。

6.或保留所有的#pragma的编译器指令,编译器后续会使⽤。

经过预处理后的.i 文件中就没有宏定义了,宏已经被展开了。头文件也都进入.i 文件中了。

 所以当我们⽆法知道宏定义或者头⽂件是否包含正确的时候,可以查看预处理后的.i⽂件来确认。

2.2编译 

编译过程就是将预处理后的⽂件进⾏⼀系列的:词法分析、语法分析、语义分析及优化,⽣成相应的汇编代码⽂件。指令如下
gcc -S test.i -o test.s
下面有一串代码,在编译时会被怎么编译呢?
array [index] = (index+ 4 )*( 2 + 6 );

2.2.1词法分析 

 这些记号被标识后,就要进行语法分析了

2.2.2语法分析 

 语法分析就是把上述的记号,根据先后顺序拆分。

2.2.3语义分析 

语义分析器来完成语义分析,这个阶段会报告错误的语法信息

 

 2.3 汇编

这个阶段就是把汇编代码变为机器可以执行的指令。 

2.4 链接

链接是⼀个复杂的过程,链接的时候需要把⼀堆⽂件链接在⼀起才⽣成可执⾏程序。
链接过程主要包括:地址和空间分配,符号决议和重定位等这些步骤。
链接解决的是⼀个项⽬中多⽂件、多模块之间互相调⽤的问题。

 

 一个文件叫test.c 一个叫add.c 经过编译后都会变成.o后缀的文件。

在test 中使用了add 中的函数和变量。由于 每个文件都是单独编译的。

编译test 的时候根本不知道 add 和g_val 的地址。所以编译器会暂时将这两个指令搁置。

等待最后链接的时候再根据符号去add 文件中查找 函数和变量的地址。

这时候才是真正的有了函数和变量的地址。

这个地址修正的过程叫做:重定位

 3. 运⾏环境

1. 程序必须载⼊内存中。在有操作系统的环境中:⼀般这个由操作系统完成。在独⽴的环境中,程序 的载⼊必须由⼿⼯安排,也可能是通过可执⾏代码置⼊只读内存来完成。
2. 程序的执⾏便开始。接着便调⽤main函数。
3. 开始执⾏程序代码。这个时候程序将使⽤⼀个运⾏时堆栈(stack),存储函数的局部变量和返回 地址。程序同时也可以使⽤静态(static)内存,存储于静态内存中的变量在程序的整个执⾏过程 ⼀直保留他们的值。
4. 终⽌程序。正常终⽌main函数;也有可能是意外终⽌。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式截图记录

设计模式截图记录

GeoServer改造Springboot启动五(解决接口返回xml而不是json)

请求接口返回的是xml,而不是我们常用的json,问题呈现如下图 40 图 40请求接口返回XML 在RequestMapping注解上增加produces {MediaType.APPLICATION_JSON_UTF8_VALUE} 图 41增加produces

AP8100 DC-DC 升压恒压电源管理芯片

说明 AP8100 是一款外围电路简单的 BOOST 升压恒压控 制驱动芯片,适用于 2.8-40V 输入电压范围的升压恒 压电源应用领域,启动电压可以低至 2.5V。 芯片会根据负载的大小自动切换 PWM , PFM 和 BURST 模式以提高各个负载端的电源系统效率。 本…

跨境电商系统源码分享,助力企业快速搭建电商平台

在如今的全球化时代,跨境电商成为了许多企业拓展国际市场的重要途径。然而,搭建一个完善的跨境电商系统并不是一件容易的事情。幸运的是,有许多跨境电商系统的现成源码可供使用,以解决企业在电商过程中遇到的各种难题。 一、现成源…

[架构之路-239]:目标系统 - 纵向分层 - 中间件middleware

目录 前言: 一、中间件概述 1.1 中间件在软件层次中的位置 1.2 什么是中间件 1.3 为什么需要中间件 1.4 中间件应用场合(应用程序不用的底层需求:计算、存储、通信) 1.5 中间件分类 - 按内容分 二、嵌入式系统的中间件 2…

基于SpringBoot的漫画动漫网站

基于SpringBootVue的漫画动漫网站的设计与实现~ 开发语言:Java数据库:MySQL技术:SpringBootMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 系统展示 主页 动漫详情 排行榜 通知公告 管理员界面 摘要 基于SpringBoot的漫画动漫网…

confluence8.5.1版本升级到8.5.2

由于confluence的漏洞CVE-2023-22515的出现,现在需要升级版本 查看漏洞已修复版本: 需要升级到8.5.2 下载软件包: https://product-downloads.atlassian.com/software/confluence/downloads/atlassian-confluence-8.5.2-x64.bin 完成后上传…

浅谈新能源电动汽车充电设施的建设及运营平台分析

安科瑞 崔丽洁 摘要:在社会经济发展的新时期,我国城市化的水平也在随之不断的提高,使我国制造业迅速崛起,并加剧了该行业的竞争力,要想使企业在竞争中占据有力的位置,企业就要顺应时代发展的潮流&#xff0…

Linux之iostat溯源diskstats

iostat 默认输出解析详细输出解析关键指标 diskstats字段解析await的计算来源计算方法 svctm计算来源计算方法 util的计算来源计算方法 系统级别的IO工具 默认输出解析 iostat%usr CPU在用户模式下的时间百分比%nice CPU处在带NICE值的用户模式下的时间百分比%system CPU在系统…

11+肠道微生物群+孟德尔随机化

今天给同学们分享一篇孟德尔随机化的生信文章“Causal relationship between gut microbiota and cancers: a two-sample Mendelian randomisation study ”,这篇文章于2023年2月21日发表在 BMC Med 期刊上,影响因子为11.15。 观察性研究和临床试验的…

《动手学深度学习 Pytorch版》 8.7 通过时间反向传播

8.7.1 循环神经网络的梯度分析 本节主要探讨梯度相关问题,因此对模型及其表达式进行了简化,进行如下表示: h t f ( x t , h t − 1 , w h ) o t g ( h t , w o ) \begin{align} h_t&f(x_t,h_{t-1},w_h)\\ o_t&g(h_t,w_o) \end{ali…

实验2.1.3 交换机的远程配置

实验2.1.3 交换机的远程配置 一、任务描述二、任务分析三、实验拓扑四、具体要求五、任务实施(一) password认证1. 进入系统视图重命名交换机的名称为SWA2. 关闭干扰信息3. 设置vty为0-44. 设置认证方式为password5. 设置登录密码为:huawei6.…

芯片测试一般包含哪些方面,ATECLOUD如何部署进行测试?

芯片测试主要包括以下方面: 功能测试:检查芯片是否按照预期进行功能操作。这涉及到对芯片内部的各种功能模块进行测试,以确保它们能够正常工作。 性能测试:检查芯片在特定工作负载或条件下的性能。这包括测试芯片在不同频率、电…

视频Logo添加实战:批量处理视频的技巧

在今天的教程中,我们将向大家介绍一种在视频上添加Logo的快捷方法。无论你是自媒体作者、视频编辑还是其他需要处理视频的从业人员,这个方法都将为你节省大量时间和精力。让我们一起学习如何使用固乔剪辑助手来实现这个任务。 首先,我们需要打…

C++初阶(二)

文章目录 一、缺省参数1、概念2、缺省参数分类1、全缺省参数2、半缺省参数 3、特性总结 二、函数重载1、引入函数重载2、函数重载概念3、函数重载分类4、C支持函数重载的原理--名字修饰(name Mangling) 三、 引用1、引用概念2、引用特性3、 常引用4、 使用场景1、做参数2、做返…

Echarts(1)

Echarts官方文档----快速上手 - Handbook - Apache ECharts 1.1ECharts的快速上手 ECharts 的入门使用特别简单, 5分钟就能够上手. 他大体分为这几个步骤 步骤1:引入 echarts.js 文件 该文件获取方式可通过:在 https://www.jsdelivr.com/package/npm…

vue3学习源码笔记(小白入门系列)------KeepAlive 原理

目录 说明组件是如何被缓存的,什么时候被激活对于KeepAlive 中组件 如何完成激活的对于KeepAlive 中组件 如何完成休眠的 总结 说明 Vue 内置了 KeepAlive 组件,实现缓存多个组件实例切换时,完成对卸载组件实例的缓存,从而使得组…

idea-配置不显示某个文件

例如, 在编辑处末尾添加 target; (注意使用分号分割) 则不会在项目位置出现该目录

每天五分钟机器学习:如何解决过拟合问题?

本文重点 过拟合是机器学习中常见的问题之一,它指的是模型在训练集上表现良好,但在测试集或新数据上表现不佳的情况。过拟合的原因是模型过于复杂,过度拟合了训练集的噪声和细节,导致泛化能力下降。 解决方案 1. 数据集扩充:增加更多的训练样本可以减少过拟合的风险。通…

详解软件测试的项目职责、分工、测试流程

一、项目职责与分工 1、产品经理 ------> 负责设计产品的原型图和PRD。 2、项目经理 ------>负责并保证高质量的产品按时完成和发布的专职管理人员。 3、开发人员 ------> 负责完成公司新产品开发计划;开发人员主要分为 前端开发、后端开发、IOS开发和安…