编译链接的过程发生了什么?

一:程序的翻译环境和执行环境

ANSI C 的任何一种实现中,存在两个不同的环境。
1 种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。
2 种是执行环境,它用于实际执行代码
也就是说:↓

1:翻译环境代码->二进制指令

2:执行环境:执行二进制指令

Q:我们写的代码是文本信息,而计算机执行的是二进制的指令,这二者之间如何进行的转换?

换句话说就是:翻译环境中发生了什么,才让代码->二进制指令?

解释: 我们写代码的文件叫作.c源文件,会经过编译器生成目标文件(不同环境和编译器的目标文件不同,比如VS是.obj,Linux环境下的gcc是.o),然后最后通过链接器把目标文件和链接库进行链接生成可执行程序。

这是一个在VS上写代码到生成可执行程序的过程,编译器为我们做了很多,才让我们能从源文件一下到目标文件,所以博主选择在Linux环境下的gcc编译器下进行细节上的演示,才能清楚的知道翻译环境到底发生了什么。

二:翻译环境工作图

解释:翻译环境分为四步

1:预编译(也叫作预处理)

2:编译

3:汇编

4:链接 

三:翻译环境工作的展示

前提准备:

源文件创建及代码书写:

①:

我们创建一个在gcc中创建一个class110目录,在其下创建一个源文件test.c,在里面写上如图所示的代码

第一阶段:预编译 

①: 然后在终端对test.c这个源文件进行gcc -E -o test.i(-E代表执行完预编译阶段就停止,然后放在test.i这个文件)

 ②:此时生成了test.i这个文件

③:将test.i和test.c进行对比 

解释:

将test.i和test.c进行对比,我们能发现了第一阶段预编译的作用:

1:注释的删除

2:头文件的包含(test.i前面的800+行,就是#include<stdio.h>的内容)

3:#define符号的替换(直接把M替换成了100)

总结:所有的预处理指令(如文件包含、宏定义、条件编译等)都是在预编译阶段完成的。

这些统称为文本操作

第二阶段:编译

①:gcc -S test.i(对test.i进行 -S(执行完第二阶段编译就停止)放进自动生成的test.s中)

解释:此时打开test.s发现全是汇编代码, 所以第二阶段的工作是:将代码翻译成汇编代码,放进了自动生成的test.s中

 第三阶段:汇编

①:gcc -c test.c(执行完第三阶段汇编就停止,放进自动生成的目标文件test.o中)
②:打开test.o,被警告

 解释:打开test.o发现其是二进制文件,所以该阶段的功能:将汇编指令翻译成了二进制指令 

③:强行打开目标文件test.o

解释:ELF是一种文件的格式 ,需要用指令readelf来读取ELF格式的文件

④:用指令readelf来读取ELF格式的文件

 解释:此时返现我们需要输入一些选项(-a,-h,-l.......)来进行选择性的查看 

⑤:-a选项,查看到段表

解释:这就是段表,也就是说ELF这种文件格式,其实是按照一个一个的段来存储的,这也是第四阶段链接中的功能合并段表中所谓的段表 

⑥:-s来查看符号表

解释:

1:此时发现符号表中有我们代码的全局变量g_val,函数Add,函数main,库函数printf

2:这些都被存储到了符号表中 ,这就是第三阶段汇编的另一个作用,形成符号表,那么符号表是做什么的?在第四阶段里面有作用

 第四阶段:链接

①:gcc test.o -0 test(链接生成可执行程序test)

②:打开可执行程序test 

解释:可执行程序test依旧是一个二进制文件,也是可以用ELF打开的

四:链接的功能讲解:

①:假设两个.c源文件

解释:一个.c只是声明了Add函数,一个.add有函数的定义

②:链接的功能

 解释:

1:每个源文件都在编译阶段 进行了符号汇总,然后在汇编阶段进行了形成符号表,即函数和对应的地址进行合并形成符号表(test.c的 Add是声明,所以地址是无效的)

2:在链接进行合并符号表,把两个源文件的符号表进行合并

3:Add的地址确认为有效地址(add.c中的函数地址)就叫作符号表的重定位

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序启动不起来,报错凡是以~/包名/*.js路径的文件,都找不到,试过网上一切方法,最终居然这么解决的,【避坑】命运的齿轮开始转动

app.json "resolveAlias": {"~/*": "/*"},文件代码也没有问题&#xff0c;网上的方法试过来了&#xff0c;大模型AI也问过遍&#xff0c;熬夜到凌晨2点半&#xff0c;最不可思议的是居然是因为微信开发者工具版本的问题&#xff0c;我真的是笑死…

网站排名,让网站快速有排名的几个方法

要让网站快速获得并提升排名&#xff0c;需要综合运用一系列专业策略和技术&#xff0c;这些策略涵盖了内容优化、技术调整、外链建设、用户体验提升等多个方面。以下是让网站快速有排名的几个方法&#xff1a; 1.内容为王&#xff1a;创造高质量、有价值的内容 -深入…

南京大学《软件分析》李越, 谭添——1. 导论

导论 主要概念: soundcompletePL领域概述 动手学习 本节无 文章目录 导论1. PL(Programming Language) 程序设计语言1.1 程序设计语言的三大研究方向1.2 与静态分析相关方向的介绍与对比静态程序分析动态软件测试形式化(formal)语义验证(verification) 2. 静态分析:2.1莱斯…

Redis数据库与GO(一):安装,string,hash

安装包地址&#xff1a;https://github.com/tporadowski/redis/releases 建议下载zip版本&#xff0c;解压即可使用。解压后&#xff0c;依次打开目录下的redis-server.exe和redis-cli.exe&#xff0c;redis-cli.exe用于输入指令。 一、基本结构 如图&#xff0c;redis对外有个…

k8s的安装和部署

配置三台主机&#xff0c;分别禁用各个主机上的swap&#xff0c;并配置解析 systemctl mask swap.target swapoff -a vim /etc/fstab配置这三个主机上的主机以及harbor仓库的主机 所有主机设置docker的资源管理模式为system [rootk8s-master ~]# vim /etc/docker/daemon.json…

为什么推荐你一定要弄懂千门八将108局,学会做局思维的人有多么的厉害?

在纷繁复杂的社会与商业环境中&#xff0c;能够洞悉事物本质、预见趋势并巧妙布局的人&#xff0c;往往能在竞争中脱颖而出&#xff0c;成为时代的弄潮儿。而“千门八将108局”这一古老而深邃的智慧体系&#xff0c;不仅蕴含了中国传统文化中对于策略、心理学、人际交往的深刻理…

PCL 提取点云边界

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 计算法向量 2.1.2 提取边界点 2.1.3 可视化边界点 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff0…

动手学深度学习(李沐)PyTorch 第 6 章 卷积神经网络

李宏毅-卷积神经网络CNN 如果使用全连接层&#xff1a;第一层的weight就有3*10^7个 观察 1&#xff1a;检测模式不需要整张图像 很多重要的pattern只要看小范围即可 简化1&#xff1a;感受野 根据观察1 可以做第1个简化&#xff0c;卷积神经网络会设定一个区域&#xff0c…

SolarWinds中如何添加华为交换机实现网络管理

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 SolarWinds作为一款广受好评的网络管理软件&#xff0c;它提供了全面的网络配置、监控和管理解决方案&#x…

组织病理学图像中的再识别|文献速递--基于多模态-半监督深度学习的病理学诊断与病灶分割

Title 题目 Re-identification from histopathology images 组织病理学图像中的再识别 01 文献速递介绍 在光学显微镜下评估苏木精-伊红&#xff08;H&E&#xff09;染色切片是肿瘤病理诊断中的标准程序。随着全片扫描仪的出现&#xff0c;玻片切片可以被数字化为所谓…

【Spring】“请求“ 之传递单个参数、传递多个参数和传递对象

文章目录 请求1. 传递单个参数注意事项1 . 正常传递参数2 . 不传递 age 参数3 . 传递参数类型不匹配 2. 传递多个参数3. 传递对象 请求 访问不同的路径&#xff0c;就是发送不同的请求。在发送请求时&#xff0c;可能会带一些参数&#xff0c;所以学习 Spring 的请求&#xff…

【093】基于SpringBoot+Vue实现的精品水果线上销售系统

系统介绍 视频演示 基于SpringBootVue实现的精品水果线上销售系统&#xff08;有文档&#xff09; 基于SpringBootVue实现的精品水果线上销售系统采用前后端分离的架构方式&#xff0c;系统设计了管理员、商家、用户三种角色&#xff0c;实现了公告类型管理、商家信誉类型管理…

自由学习记录

约束的泛型通配符? Java中的泛型 xiaomi和byd都继承了car&#xff0c;但是只是这两个类是car的子类而已&#xff0c;而arraylist<xiaomi> ,arraylist<byd> 两个没有半毛钱继承关系 所以传入的参数整体&#xff0c;是car的list变形&#xff0c;里面的确都能存car…

SDK4(note下)

以下代码涉及到了很多消息的处理&#xff0c;有些部分注释掉了&#xff0c;主要看代码 #include <windows.h> #include<tchar.h> #include <stdio.h> #include <strsafe.h> #include <string> #define IDM_OPEN 102 /*鼠标消息 * 键盘消息 * On…

数据湖数据仓库数据集市数据清理以及DataOps

一提到大数据我们就知道是海量数据&#xff0c;但是我们并不了解需要从哪些维度去考虑这些数据的存储。比如 数据湖、数据仓库、数据集市&#xff0c;以及数据自动化应用DataOps有哪些实现方式和实际应用&#xff0c;这篇文章将浅显的做一次介绍。 数据湖 数据湖是一种以自然…

SimpleFoc以及SVPWM学习补充记录

SimpleFoc SimpleFOC移植STM32&#xff08;一&#xff09;—— 简介 FOC控制的过程是这样的&#xff1a; 对电机三相电流进行采样得到 Ia,Ib,Ic。将 Ia,Ib,Ic 经过Clark变换得到 I_alpha I_beta。将 I_alpha I_beta 经过Park变换得到 Id,Iq。计算 Id,Iq 和其设定值 Id_ref 和…

网络知识点之—EVPN

EVPN&#xff08;Ethernet Virtual Private Network&#xff09;是下一代全业务承载的VPN解决方案。EVPN统一了各种VPN业务的控制面&#xff0c;利用BGP扩展协议来传递二层或三层的可达性信息&#xff0c;实现了转发面和控制面的分离。 EVPN解决传统L2VPN的无法实现负载分担、…

《神经网络》—— 长短期记忆网络(Long Short-Term Memory,LSTM)

文章目录 一、LSTM的简单介绍二、 LSTM的核心组件三、 LSTM的优势四、 应用场景 一、LSTM的简单介绍 传统RNN循环神经网络的局限&#xff1a; 示例&#xff1a;当出现“我的职业是程序员。。。。。。我最擅长的是电脑”。当需要预测最后的词“电脑”。当前的信息建议下一个词可…

[Python] 使用Python自定义生成二维码

文章目录 目录 安装 qrcode 库生成简单的二维码代码讲解 生成自定义样式的二维码代码讲解 生成带有链接的二维码代码讲解 Demo代码实现代码讲解 总结 收录专栏: [Python] 二维码是现在非常常用的一种信息存储和传递方式&#xff0c;我们可以通过扫描二维码来快速获取文本、链接…

如何在测试中模拟请求和响应?

在日常开发中&#xff0c;除了在服务器端进行单元测试之外&#xff0c;还经常需要做集成测试&#xff0c;为了能更好地做一些边界测试&#xff0c;我们常常需要mock一些HTTP请求或者响应&#xff0c;今天我们就来聊聊几种常见的方式。 服务器端设置 在开发中&#xff0c;我们…