浅析编译与链接

news2024/11/29 4:34:13

生成可执行文件的四个过程

当编写和构建计算机程序时,预处理、编译、汇编和链接是将源代码转化为可执行程序的关键过程。以下是对每个阶段的详细解释:

1. 预处理(Preprocessing):将.c/.cpp文件中的头文件展开、宏展开,生成.i文件
预处理是编译过程的第一个阶段,它在编译之前对源代码进行处理。预处理器执行以下任务:
- 宏替换:根据预定义的宏规则,将源代码中的宏调用替换为对应的文本。
- 头文件包含:将头文件的内容插入到源代码中,以便在编译时可以使用头文件中定义的内容。
- 条件编译:根据条件指令选择性地编译特定部分的代码。

2. 编译(Compilation):将预处理之后的.i文件,生成 .s 汇编文件
编译是将预处理后的源代码转换为中间代码(通常是汇编语言或字节码)的过程。编译器在这个阶段执行以下任务:
- 词法分析:将源代码分解为标记(tokens),如关键字、标识符、运算符等。
- 语法分析:根据语言的语法规则,将标记组合成语法树(syntax tree),用于表示程序的结构。
- 语义分析:检查语法树是否符合语言的语义规则,如变量的声明和使用是否正确。
- 代码生成:将语法树转换为目标代码(通常是汇编语言或字节码),包括指令序列和数据结等。

而且,此时在编译阶段,符号表开始形成并逐步积累符号的信息。符号表是一个数据结构,用于存储程序中使用的符号及其相关信息。

3. 汇编(Assembly):将.s 汇编文件,生成.o 目标文件
汇编是将编译生成的汇编语言代码转换为可执行机器指令的过程。在这个阶段,汇编器执行以下操作:
- 读取编译生成的汇编语言代码。
- 将汇编代码转化为机器码,即二进制表示的指令。
- 为每条指令生成相应的机器码,并解析变量和函数的引用。

汇编器继续使用符号表,根据汇编代码中的符号引用解析变量和函数的定义,并为它们分配相应的内存地址。

4. 链接(Linking):将.o文件链接,生成目标文件.exe或.out
链接是将编译和汇编生成的目标代码文件以及其他必要的库文件组合在一起,生成最终的可执行程序或可加载模块的过程。链接器执行以下任务:
- 符号解析:解析目标代码中的符号引用,如函数调用和变量引用。
- 地址分配:为每个符号分配内存地址,确定符号在内存中的位置。
- 重定位:修改目标代码中的相对地址,使其正确地指向符号的实际位置。

链接器使用符号表中的信息来解析符号引用并更新目标代码中的地址。

符号表

我们发现,上面反复提到了符号表。那么符号表是什么呢?符号表是一个数据结构,用于存储程序中使用的符号(如变量名、函数名、类名等)以及与之相关的信息。它在编译和链接过程中起着重要的作用,用于符号解析、类型检查、地址分配和重定位等操作。

在符号表中,每个符号都有一个对应的条目,包含了以下信息:(只是简要概括,并未全部列出)

1. 符号名称(Symbol Name):表示符号的名称,如变量名、函数名、类名等。

2. 符号类型(Symbol Type):指示符号的类型,如变量、函数、类等。

3. 数据类型(Data Type):描述符号所代表的数据类型,如整数、浮点数、字符串等。

4. 存储信息(Storage Information):指示符号在内存中的存储方式,如静态存储、栈上存储或堆上存储。

5. 内存地址(Memory Address):如果符号是变量或函数,符号表会记录其在内存中的地址或相对地址。

6. 作用域(Scope):指示符号的可见范围,即在哪个部分或代码块中可访问该符号。

7. 变量属性(Variable Attributes):包括符号的大小、访问权限、生命周期等属性。

8. 参数列表(Parameter List):如果符号是函数,符号表会记录函数的参数列表,包括参数的名称和类型。

9. 返回类型(Return Type):如果符号是函数,符号表会记录函数的返回类型,即函数执行后的返回值类型。

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

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

相关文章

【PostgreSQL内核学习(一)—— Ubuntu源码安装PostgreSQL】

Ubuntu源码安装PostgreSQL 1. PostgreSQL官网下载压缩包2. 解压&安装2.1 解压文件2.2 安装依赖2.3 执行安装2.4 执行安装2.5 添加路径到文件 3. 初始化数据库与使用3.1 初始化数据库3.2 启动数据库服务3.3 启动数据库 1. PostgreSQL官网下载压缩包 下载地址:ht…

【黑马头条之freemarker入门】

本笔记内容为黑马头条项目的freemarker部分 目录 一、freemarker 介绍 二、环境搭建&&快速入门 1、创建测试工程 2、配置文件 3、创建模型类 4、创建模板 5、创建controller 6、创建启动类 7、测试 三、freemarker基础 1、基础语法种类 2、集合指令&#…

【iOS】—— 面向对象,Runtime,ARC等问题总结

对于暑假学习大多数是对之前学习的一个复习,在这里只做对之前学习欠缺知识的补充以及这些知识点涉及的一些问题,从问题入手学习。 文章目录 面向对象1.一个NSObject对象占多少内存?2.对象的isa指针指向哪里?3.OC的类信息存放在哪…

PLSQL编程

1.概念和目的 1.1. 什么是PL/SQL? PL/SQL(Procedure Language/SQL) 是Oracle对sql语言的过程化扩展 (类似于Basic); 指在SQL命令语言中增加了过程处理语句(如分支、循环等),使SQL语言具有过程处理能力。…

Spring @Autowired 注解原理

Spring Autowired 注解原理 1.Autowired 使用 ComponentScan("org.example.bean") public class AnnoContextDemo {Autowiredprivate User user;public static void main(String[] args) {AnnotationConfigApplicationContext context new AnnotationConfigApplic…

Ultipa嬴图数据库 | 深圳国际金融科技大赛圆满落幕

2023年7月13日,由深圳市地方金融监督管理局、深圳市福田区人民政府、深圳市南山区人民政府指导,招商局金融科技有限公司主办的2022深圳国际金融科技大赛总决赛在福田区圆满落幕。经过从初赛到决赛,共计103个项目的激烈角逐,Ultipa…

Unity视角拉近时物体缺失的问题处理

在Unity的开发过程中,我们可能会遇到以下情况: 就是在场景的不断编辑中,突然又一次打开场景,再拉近或拉远场景视角时,会出现场景中的对象会显示不全的问题。 出现了这样的情况会让场景的预览很不友好。 出现这个问题的…

【006】面向 6G 的深度图像语义通信模型

摘要 目前的语义通信模型在处理图像数据方面仍有可改善的部分,包括有效的图像语义编解码、高效的语义模型训练和精准的图像语义评估。为此,提出了一种深度图像语义通信(DeepISC)模型。首先采用基于 vision transformer 的自编码器…

数字IC后端设计实现中的Post-mask ECO应该怎么做?

在数字IC后端设计实现中,我们经常会涉及到芯片需要做Function ECO。常见的Function ECO可以分为pre mask ECO和post mask ECO两种。因此,作为一个数字IC后端工程师,必须熟练掌握这两种Function ECO的实现流程及其实现技巧。 两者的区别在于&…

栈和队列【数据结构】

1、栈 &#xff08;1&#xff09;Stack.h #pragma once #include <stdio.h> #include <assert.h> #include <stdlib.h> #include <stdbool.h>typedef int STDataType;typedef struct Stack {STDataType* a;int top;int capacity; }ST;void STInit(ST*…

[JVM] 5. 运行时数据区(2)-- 程序计数器(Program Counter Register)

一、概述 JVM中的程序计数器&#xff08;Program Counter Register&#xff09;是对物理PC寄存器的一种抽象模拟。它是一块很小的内存空间&#xff0c;几乎可以忽略不记。也是运行速度最快的存储区域。在 JVM 规范中&#xff0c;每个线程都有它自己的程序计数器&#xff0c;是…

.nvmrc无效

背景 既然你已经使用了nvm那么他的功能我就不介绍了。但是使用场景我与开发小伙伴探讨了一下发现很多问题。你的nvm使用方法真的正确吗&#xff1f; 问题&#xff1a;假设现在有10个项目对应10个不同的node版本&#xff0c;你应该怎么来管理呢&#xff1f; 同学1&#xff1a; …

LT8619C是一款高性能HDMI转TTL/BT656/BT601/BT1120加2PORT LVDS,支持高达4K30HZ的分辨率。

LT8619C • 概述&#xff1a; Lontium的LT8619C是一款高性能的HDMI/双模式DP接收器芯片&#xff0c;符合HDMI 1.4规范&#xff0c;支持HDCP1.4解码&#xff0c;对HDMI的支持分辨率高达4Kx2K30Hz。TTL输出可支持RGB、BT656、BT1120&#xff0c;支持最多24位RGB或BT656/BT1120输…

动手学深度学习——多层感知机(原理解释+代码详解)

目录 一、多层感知机1. 隐藏层1.1 线性模型可能会出错1.2 在网络中加入隐藏层1.3 从线性到非线性1.4 通用近似定理 2. 激活函数2.1 ReLU函数2.2 sigmoid函数2.3 tanh函数 3. 小结 二、多层感知机的从零开始实现2.1 初始化模型参数2.2 激活函数2.3 模型2.4 损失函数2.5 训练 三、…

【数据结构刷题】消失的数字和轮转数组

目录 一.消失的数字 方法一:异或全部元素 方法二:利用等差数列求和-该数组全部元素之和。 二.轮转数组 题型1:实现一个函数&#xff0c;可以左旋字符串中的k个字符。 写法1:暴力求解 根据该题写出右旋转 写法2&#xff1a;三步旋转法(左逆序&#xff0c;右逆序&#xff0c;整体…

2023年7月字节前端青训营入营题目记录(大题)

前言&#xff1a; 不一定是完整的题目内容&#xff0c;但意思差不多是一个意思 1.实现一个url解析成对象的函数&#xff1a; function ParseParams(url: string): Record<string, any> {const paramsstr url.split("?")[1];const paramsArr paramsstr.spl…

IDEA中把导航栏的字体放大

IDEA中如何把导航栏的字体放大&#xff1f; 选择File--Settings--Appearance&#xff0c;找到下面的size,选择自己想要的字体大小后点击 OK 即可。 字体大了果然看的更舒服了~写代码都有动力了哈哈哈哈 服了~

MySQL基本语句

目录 一、MySQL数据库管理 查看数据库信息 查看数据库中的表信息use 数据库名 #切换到书库中 显示数据表的结构&#xff08;字段&#xff09; 二、SQL语句 1.创建新的数据库 2.创建新的表 3.增加&#xff08;insert&#xff09; 4.删除 4.1清空表 4.2删除表 5.修改…

SpringMVC的数据响应-直接回写json字符串

一般我们操作对象&#xff0c;将对象转变为json 这时导入json 转换工具的包 包1 包2-json数据绑定 包3 返回的就是json字符串你直接返回就行了 返回一个json格式的字符串 直接回写就加这个res.... 内部字符串要进行相应的转意 能够看到json字符串 能不能你封装对象&#xff0c…

jenkins+python+pytest+selenium 自动化执行脚本并发送报告

目录 安装jenkins jenkins 安装网址&#xff1a; 傻瓜式安装 配置环境 键path 或者随便填 构建后操作 在jenkins上展示html的报告&#xff0c;需要添加一个HTML Publisher plugin插件 查看报告显示丢失了css样式 加载css样式丢失解决&#xff1a;https://www.cnblogs.com/…