程序的编译链接【编译链接大概步骤】

全文目录

  • 😀 前言
  • 🙂 翻译环境和执行环境
  • 😶 编译和链接
    • 😵‍💫 预编译(预处理)
    • 😵‍💫 编译
    • 😵‍💫 汇编
    • 😵‍💫 链接
  • 🌈 总结

😀 前言

🙂 翻译环境和执行环境

翻译环境:

在这个环境中源代码被转换为可执行的机器指令(二进制的指令)。

执行环境:

它用于实际执行代码。

在这里插入图片描述

我们日常使用的VS2019就是一个集成开发环境,结合了编辑、编译、链接、调试等多种功能,其中编译使用的是 cl.exe, 链接使用的是 link.exe 文件中,不同的编辑器使用的可能不同。

😶 编译和链接

  • 组成一个程序的每个源文件通过编译过程分别转换成目标代码(object code)。
  • 每个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序。
  • 链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人 的程序库,将其需要的函数也链接到程序中。

在这里插入图片描述

其中编译又分为:预编译、编译、汇编 三步操作

为了方便演示,接下来使用Linux下的gcc进行实验。

实验代码:

// test.c
#include <stdio.h>extern Add(int a, int b);// 测试注释和#define
#define Max 100int main()
{int z = Max;int a = 10;int b = 20;int c = Add(a, b);printf("%d\n", c);return 0;
}
// add.c
int Add(int a, int b)
{return a + b;
}

😵‍💫 预编译(预处理)

我们可以使用下面的指令将程序编译停留在预编译后:

gcc test.c -E -o test.i
gcc add.c -E -o add.i

打开test.i 可以发现多了很多行,同时注释的代码和 #define 都不见了:

在这里插入图片描述

再从/usr/include 这个路径下打开stdio.h 这个文件可以发现 test.i 中多出来的就是stdio.h的内容

在这里插入图片描述

那么就可以确定预编译阶段进行了一下几个操作:

  1. 头文件的包含 (#include
  2. #define 定义符号的替换
  3. 注释的删除

以上三个都是属于文本操作

😵‍💫 编译

将程序停留在编译之后:

gcc test.i -S -o test.s
gcc add.i -S -o add.s

打开test.s 可以看到:

在这里插入图片描述

这些都是之前在VS 中看到的反汇编。也就是说编译将C语言代码翻译成了汇编代码。其过程相当复杂,主要是做了一下几个操作:

  1. 语法分析
  2. 词法分析
  3. 语义分析
  4. 符号汇总

符号汇总:将文件中的全局符号汇总出来(局部的符号不管), 基本上就是函数名

😵‍💫 汇编

将程序停留在编译之后:

gcc test.s -c -o test.o
gcc add.s -c -o add.o

生成的就是目标文件。在Windows下目标文件的后缀时.obj,Linux下的后缀时.o

打开test.o

在这里插入图片描述

发现全是乱码,也就是说汇编将汇编指令翻译成了二进制的指令。

但是这时候在编译阶段进行的符号汇总就派上用场了,这些符号在汇编阶段被制成了符号表。二进制文件我们时看不懂的,在Linux下可执行程序的格式是:elf ,所以我们可以借助readelf 来查阅可执行文件:

readelf -s test.o

在这里插入图片描述

readelf -s add.o

在这里插入图片描述

汇编就是对每个编译阶段汇总的符号赋予地址(如果在文件中找不到该符号的有效内容,赋予无效地址),即:

在这里插入图片描述

😵‍💫 链接

链接阶段做的就是:

  1. 合并段表
  2. 符号表的合并和重定位

合并段表就是将每个目标文件的各个段整合起来,符号表的合并就是将各个目标文件的符号表合并成一个表,并检查每个符号的地址:

在这里插入图片描述

🌈 总结

程序的编译和链接过程是很复杂的,能力有限,只能学习这些大概的概念。

Linux 指令汇总:

// 编译的各个阶段:
ESc  ——> iso// 查看目标文件:
readelf -[options] filename// 头文件路径:
/usr/include

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

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

相关文章

分布式定时任务框架Quartz总结和实践(2)—持久化到Mysql数据库

本文主要介绍分布式定时任务框架Quartz集成SpringBoot持久化数据到Mysql数据库的操作&#xff0c;上一篇文章使用Quartz创建定时任务都是保存在内存中&#xff0c;如果服务重启定时任务就会失效&#xff0c;所以Quartz官方也提供将定时任务等信息持久化到Mysql数据库的功能&…

【ES6】—数组的扩展

一、类数组/ 伪数组 1. 类/伪数组: 并不是真正意义的数组&#xff0c;有长度的属性&#xff0c;但无法使用Array原型上的方法 let divs document.getElementsByTagName(div) console.log(divs) // HTMLCollection []let divs2 document.getElementsByClassName("xxx&q…

Git gui教程---第七篇 Git gui的使用 返回上一次提交

1&#xff0e; 查看历史&#xff0c;打开gitk程序 2&#xff0e; 选中需要返回的版本&#xff0c;右键&#xff0c;然后点击Rest master branch to here 3.出现弹窗 每个选项我们都试一下&#xff0c;从Hard开始 返回的选项 HardMixedSoft Hard 会丢失所有的修改【此处的…

从0开始做yolov5模型剪枝

文章目录 从0开始做yolov5模型剪枝 ****1 前言2 GitHub取源码3 原理3.1 原理3.2 network slimming过程 4 具体实施步骤4.1 安装虚拟环境4.2 配置参数4.2.1 数据集参数4.2.2 模型结构参数4.2.3 train.py中的参数 4.3 正常训练4.3.1 准备4.3.2 训练及问题解决 4.4 稀疏化训练4.4.…

VbScript脚本Request获取RFID读卡器以HTTP提交的访问文件中的参数Response回应驱动读卡器显示、播报语音

本示例使用的设备&#xff1a;RFID网络WIFI无线TCP/UDP/HTTP可编程二次开发读卡器POE供电语音-淘宝网 (taobao.com) <%LANGUAGE"VBSCRIPT" CODEPAGE"65001"%><% Function bin2str(bindata)Dim rsStream, strlsSet rsStream Server.CreateObject…

今天不想学习

【深基16.例1】淘汰赛 - 洛谷 根据队列知识&#xff0c;和巧用题目信息&#xff0c;代码都很简单哈哈哈&#xff0c;因为我会的不多 #include<iostream> #include<queue> #include<map> using namespace std; #define int long long int n,num1; signed ma…

Leetcode 2235.两整数相加

一、两整数相加 给你两个整数 num1 和 num2&#xff0c;返回这两个整数的和。 示例 1&#xff1a; 输入&#xff1a;num1 12, num2 5 输出&#xff1a;17 解释&#xff1a;num1 是 12&#xff0c;num2 是 5 &#xff0c;它们的和是 12 5 17 &#xff0c;因此返回 17 。示例…

数据库管理

SQL语言分类&#xff1a; DDL&#xff1a;数据定义语言&#xff0c;用于创建数据库对象&#xff0c;如库、表、索引等 DML&#xff1a;数据操纵语言&#xff0c;用于对表中的数据进行管理 DQL&#xff1a;数据查询语言&#xff0c;用于从数据表中查找符合条件的数据记录 DCL&am…

渗透测试方法论

文章目录 渗透测试方法论1. 渗透测试种类黑盒测试白盒测试脆弱性评估 2. 安全测试方法论2.1 OWASP TOP 102.3 CWE2.4 CVE 3. 渗透测试流程3.1 通用渗透测试框架3.1.1 范围界定3.1.2 信息搜集3.1.3 目标识别3.1.4 服务枚举3.1.5 漏洞映射3.1.6 社会工程学3.1.7 漏洞利用3.1.8 权…

[LitCTF 2023]Flag点击就送!

进入环境后是一个输入框&#xff0c;可以提交名字 然后就可以点击获取flag&#xff0c;结果回显提示&#xff0c;需要获取管理员 可以尝试将名字改为admin 触发报错&#xff0c;说明可能存在其他的验证是否为管理员的方式 通过抓包后&#xff0c;在cookie字段发现了 特殊的东西…

嵌入式系统入门实战:探索基本概念和应用领域

嵌入式系统是一种专用的计算机系统,它是为了满足特定任务而设计的。这些系统通常具有较低的硬件资源(如处理器速度、内存容量和存储容量),但具有较高的可靠性和实时性。嵌入式系统广泛应用于各种领域,如家用电器、汽车、工业控制、医疗设备等。 嵌入式系统的基本概念 微控…

Springboot整合liquIbase组件

liquIbase方式 1、添加依赖 <!-- Liquibase 依赖 --> <dependency><groupId>org.liquibase</groupId><artifactId>liquibase-core</artifactId> </dependency>2、添加配置项 spring:# datasource 数据源配置内容&#xff0c;对应…

实战项目 在线学院springcloud调用篇3(nacos,feging,hystrix,gateway)

一 springcloud与springboot的关系 1.1 关系 1.2 版本关系 1.3 list转json串 public class Test {public static void main(String[] args) {List<String> dataListnew ArrayList<String>();dataList.add("12");dataList.add("45");dataLi…

java8的reduce方法

在 Java 8 中&#xff0c;reduce 是一个流操作方法&#xff0c;用于将流中的元素按照指定的操作进行归约&#xff08;reduce&#xff09;操作&#xff0c;最终得到一个结果。 reduce 方法有三种重载形式&#xff1a; T reduce(T identity, BinaryOperator<T> accumulato…

Debezium系列之:Debezium Server Offset编辑器

Debezium系列之:Debezium Server Offset编辑器 一、认识Offset编辑器二、Offset编辑器目录结构三、Offset编辑器系统环境要求四、pom.xml五、Main.java六、CommandLineInterface.java七、OffsetFileController.java八、OffsetEditorApp.java九、编译项目十、启动Offset编辑器一…

2023国赛数学建模思路 - 案例:退火算法

文章目录 1 退火算法原理1.1 物理背景1.2 背后的数学模型 2 退火算法实现2.1 算法流程2.2算法实现 建模资料 ## 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 退火算法原理 1.1 物理背景 在热力学上&a…

深入剖析Kubernetes之控制器模式的实现-Deployment

文章目录 Deployment Deployment Deployment 实现了 Kubernetes 项目中一个非常重要的功能&#xff1a;Pod 的“水平扩展 / 收缩”&#xff08;horizontal scaling out/in&#xff09;。这个功能&#xff0c;是从 PaaS 时代开始&#xff0c;一个平台级项目就必须具备的编排能力…

oCPC实践录 | oCPC转化的设计、选择、归因与成本设置(1)

如前文所言&#xff0c;在CPC情况下&#xff0c;广告主根据经验通过选定媒体、关键词、人群定向等方法筛选流量&#xff0c;然后给出相对应的点击出价采买流量。在oCPC下&#xff0c;广告主通过转化目标和相对应的转化出价采买流量。 经常有人说相比CPC&#xff0c;在oCPC下&a…

Idea配置Remote Host

一、打开RemoteHost窗口 双击shift打开全局搜索 搜索Tools→Deployment→Browse Remote Host或 idea项目顶部Tools→Deployment→Browse Remote Host 二、添加服务 右侧边栏打开RemoteHost&#xff0c;点击三个点&#xff0c;起个名字&#xff0c;选择type为SFTP&#xff…

使用Nacos与Spring Boot实现配置管理

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…