程序的翻译环境【编译链接的过程】【详解】

news2024/12/28 6:05:21

在这里插入图片描述

本期介绍🍖
主要介绍:代码是如何一步步的转化成可执行城西的,详细介绍了编译和链接的过程,特别是在编译还可分为预编译、编译、汇编三个阶段,介绍每个阶段分别干什么。👀。


文章目录

  • 一、概述🍖
  • 二、编译与链接的过程🍖
    • 2.1 预编译 / 预处理🍖
    • 2.2 编译🍖
    • 2.3 汇编🍖
    • 2.4 链接🍖
  • 三、程序执行时的过程🍖
  • 四、总结🍖


一、概述🍖

  在ANSIC规定任何一个C语言代码都会经过下面两个环境:

  1. 翻译环境:将源代码转换成可执行的机器指令。
  2. 执行环境:实际执行代码。

  而今天主要讲述的是翻译环境,也就是编译链接这两个部分。想必大家在学习《C语言》第一章时就听过这样子的一个说法:一个程序必然需要经过编译和链接这两个阶段才能生成一个可执行的代码,计算机才能执行。书上给出的原因是:我们所编写的原代码(也就是以.c为后缀的文件)计算机是看不懂的,它只能读懂二进制的代码。所以必须经过人为的翻译,使其转换成计算机可以读懂的代码。事实也确实如此,不过我还需要补充几点:如下图所示。

在这里插入图片描述

  1. 每一个源文件(.c)都会单独经过编译器操作生成一个与之对应的目标文件(.obj)

  那有人就要这么问了:为什么一个项目中会存在多个源文件? 那是因为,当项目组在开发一个软件的时候,是不可能只存在一个源文件,不然大家怎么协同啊,你写完我写,我写完再他写,是不是太浪费时间了呀。所以在一个工程当中大家是分模块写的(也就是.c文件),你写你的模块,我写我的模块,最后再把所有模块合并成完整的项目。

  下面我们来证明一些是否真是每一个源文件都会生成自己所对应的目标文件。

在这里插入图片描述
在这里插入图片描述

  在该项目的文件路径底下,当调试过后test.cAdd.c会分别生成test.objAdd.obj这两个目标文件。

  1. 链接器会把所有目标文件加上链接库一起合并生成一个可执行的程序(.exe的文件)

在这里插入图片描述
  注意:在VS中使用的编译器是cl.exe,而链接器是link.exe的工具。


二、编译与链接的过程🍖

  通过上面的学习我们知道一个源程序想要转换成可执行程序,就必须经过编译和链接两个过程。但编译这个阶段其实没有想象中的这么简单,它还可以细分为三个阶段:预编译(预处理)、编译汇编。如下图所示:
在这里插入图片描述
  至于每一个阶段都干了些上面这是我们今天重点想要论述的。而由于VS是集成开发环境(也就是说,这种开发环境省略了按步进行调试,是直接一步到位的,中间过程我们无法获取),是无法观测到编译期间的每一步细节的,所以后面我们会使用gcc编译器来进行演示。


2.1 预编译 / 预处理🍖

  预编译这个阶段只干三件事:

  1. #include涉及的头文件包含到文件中来
  2. #define所定义的符号进行替换,然后删除定义语句
  3. 删除注释行

  可以见得,其实预编译期间只进行了文本操作,譬如头文件的拷贝,字符的替换,语句的删除。注意:预编译期间是不会对源文件进行任何的修改的,它只会对源文件进行相应的处理,然后生成一个新的文件,使之继续进行接下来的编译操作。下面我们来演示证明一下:
在这里插入图片描述

  可见,预处理阶段会将#include所涉及的文件整个的包含到我们的文件当中来。

在这里插入图片描述

  可以看出,预编译后#define MAX 100与代码中的MAX进行了替换,然后删除了原定义语句,注释也进行了删除。


2.2 编译🍖

  编译阶段笼统的来说:就是把C语言代码转换成汇编代码。不过这个过程较为复杂,需要进行词法分析语法分析语义分析符号汇总,最终才能转换成汇编代码。下面来演示一下,通过对上一个编译生成的test.i文件进行汇编操作,如下所示:

在这里插入图片描述

  可以见的,经过编译操作后确实将C语言代码转换成汇编代码。今天重点还需要来讲下 “符号汇总”,因为这一步操作会为后期 “汇编” 和 “链接” 所服务,最终达成某些目的。符号汇总会将代码中所有的全局符号汇总到一起。就譬如上面代码中汇总的全局符号如下图所示:

在这里插入图片描述


2.3 汇编🍖

  汇编操作大致来说就是把汇编代码转换成二进制代码(计算机可以执行的代码)。下面来演示一下结果:

在这里插入图片描述

  汇编操作除了会将汇编代码转换成二进制代码,还会形成符号表所谓的符号表,就是给之前编译期间汇总的全局符号关联一个地址,并制成一张表。下面来举个例子:

在这里插入图片描述

  至于这张表制出来到底有什么用,你会在链接期间知晓。


2.4 链接🍖

  链接期间会做两件事:

  1. 合并段表

  至于什么是合并段表呢?我们需要知道,在gcc中其实后缀为.o的文件都是以elf的格式来组织文件内容。elf格式的存放习惯会将整个文件分成很多段,每一段都存放不同类型的数据。而链接操作会把多个目标文件加上链接库一起,把相同类型的数据合并到同一段中,最终合并成可执行文件。如下图所示:
在这里插入图片描述
  注意:此处由多个目标文件和链接库合并成的可执行文件,数据存储的格式也是elf格式

  1. 符号表的合并与重定位

  符号表的合并与重定位顾名思义,就是将之前每一个目标文件形成的符号表进行合并和删选,最终形成唯一一张表与可执行程序对应。那为什么要形成这样一张符号表呢?为的是能够在链接期间跨文件的寻找函数或者全局变量,同样也是为之后执行代码时能够通过符号表中存放的地址来对函数进行调用。如下所示:

在这里插入图片描述

  但注意:当Add函数定义不存在时,那么最终合并重定位的符号表中,Add所关联的地址就是无效地址,会在符号表进行审核时,出现链接性错误。如下图所示:

在这里插入图片描述


三、程序执行时的过程🍖

  1. 程序必须载入内存当中才能执行起来。在有操作系统的环境中,一般由操作系统来完成。在独立的环境中,一般是由人工手动载入内存当中的,或者时通过烧录软件将代码置入内存中的。
  2. 程序执行开始,首先会调用main函数。
  3. 开始执行程序代码,这时会创建一个临时的调用堆栈,用于存储函数调用和返回时所需的各种参数,以及创建的局部变量。(也就是函数栈帧的创建与销毁)
  4. 终止程序。

四、总结🍖

在这里插入图片描述


在这里插入图片描述

这份博客👍如果对你有帮助,给博主一个免费的点赞以示鼓励欢迎各位🔎点赞👍评论收藏⭐️,谢谢!!!
如果有什么疑问或不同的见解,欢迎评论区留言欧👀。

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

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

相关文章

手写一个简单的mybatis

1.写个简单的mybatis 今天写个简单版V1.0版本的mybatis,可以其实就是在jdbc的基础上一步步去优化的,网上各种帖子都是照着源码写,各种抄袭,没有自己的一点想法,写代码前要先思考,如果是你,你该…

【数据库数据恢复】MS SQL数据库提示“附加数据库错误 823”怎么恢复数据?

MS SQL Server是微软公司研发的数据库管理系统,SQL Server是一个可扩展的、高性能的、与WindowsNT有机结合的,为分布式客户机/服务器所设计的数据库管理系统,提供基于事务的企业级信息管理系统方案。 SQL Server数据库故障情况&分析&…

RCNN学习笔记-MobileNet

Abstract 我们提出了一类叫做MobileNets的高效模型用于移动和嵌入式视觉应用。MobileNets基于一种简化的架构,该架构使用深度方向可分离卷积来构建轻量级深度神经网络。我们引入了两个简单的全局超参数,可以有效地在延迟和准确性之间进行权衡。这些超参…

套用bi模板,轻松搞定各类数据分析报表

bi模板是什么?是一个个提前预设的报表设计,套用后立即生效,轻轻松松搞定bi数据可视化分析报表。bi模板都有哪些类型?怎么套用?以奥威bi数据可视化软件为例,聊聊bi模板的种类和下载使用。 bi模板有哪些? …

Web Component入门

本文作者为奇舞团前端开发工程师引言前端开发者,现在在进行项目的开发时,一般很少使用原生的js代码,往往都会依靠Vue,React等框架进行开发,而不同的框架都有自己不同的开发规则,但是目前所使用的主流框架&a…

关于小程序swiper图片不能撑满解决方案

问题描述 最近在写小程序的时候使用了swiper组件,但是发现一个很奇怪的现象,如果给image组件设置mode“widthFix”的话,那么图片的高度是不够撑满swiper-item的这样就会导致swiper的指示器往下偏移(其实没有偏移,只是…

代码随想录刷题Day58 | 739. 每日温度 | 496. 下一个更大元素 I

代码随想录刷题Day58 | 739. 每日温度 | 496. 下一个更大元素 I 739. 每日温度 题目: 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在…

剑指Offer51——数组中的逆序对

摘要 剑指 Offer 51. 数组中的逆序对 一、暴力的方法 1.1 暴力的解析 使用两层 for 循环枚举所有的数对,逐一判断是否构成逆序关系。 1.2 复杂度分析 时间复杂度:O(N^2),这里N是数组的长度;空间复杂度:O(1)。 1…

【芯片应用】PA93

文章目录一、简介二、原理1、外部连接(1)相位补偿(2)限流电阻一、简介 性质:高压运算放大器 厂商:美国 APEX Microtechnology公司 供电电压:Vs to -Vs:最高400V,即200V …

【web课程设计】HTML+CSS仿QQ音乐网站

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

【Windows基础】NTFS文件系统

NTFS文件系统 windows上的文件系统 早期Windows上使用:FAT16或FAT32(Windows98)目前Windows操作系统基本使用的是NTFS文件系统ReFS文件系统 ReFS(Resilient File System,复原文件系统)是在 Windows Serve…

万众期待的Dyson Zone空气净化耳机确认将于中国首发,戴森重新定义“好声音”

同享纯净音质与洁净空气,Dyson Zone™ 空气净化耳机确认将在中国开启全球首发 中国, 2022年12月8日 – 今日,戴森首次公开了Dyson Zone™ 空气净化耳机的详细技术参数,该产品已确认将在中国开启全球首发,并在戴森指定…

玩好.NET高级调试,你也要会写点汇编

一:背景 1. 简介 .NET 高级调试要想玩的好,看懂汇编是基本功,但看懂汇编和能写点汇编又完全是两回事,所以有时候看的多,总手痒痒想写一点,在 Windows 平台上搭建汇编环境不是那么容易,大多还是…

[附源码]Python计算机毕业设计SSM佳音大学志愿填报系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Mybatis日志配置(slf4j、log4j、log4j2)

文章目录1. Mybatis日志1.1 日志实现原理1.2 日志实现方式2. SLF4J2.1 slf4j日志级别2.2 日志门面与日志实现2.3 日志门面与日志依赖配置3. LOG4J3.1 日志级别3.2 log4j重要组件3.3 mybatis日志配置log4j3. LOG4J23.1 mybatis配置log4j23.2 log4j2配置文件1. Mybatis日志 1.1 …

elasticsearch集群数据索引迁移自动化脚本

日常维护elasticsearch集群会出现新老集群数据迁移,这里使用的是snapshot api是Elasticsearch用于对数据进行备份和恢复的一组api接口,可以通过snapshot api进行跨集群的数据迁移,原理就是从源ES集群创建数据快照,然后在目标ES集群中进行恢复。 1、新老集群修改集群配置文…

潦草手写体也能轻松识别,快速提取文字不用愁

基于文本识别(OCR)技术的成熟与应用,日常生活中的大部分“印刷体识别”需求都能被满足,替代了人工信息录入与检测等操作,大大降低输入成本。 而对于复杂的手写体识别需求,业界识别质量却参差不齐。大部分手…

【Linux】进程优先级进程切换

索引➡️进程优先级1.什么叫做优先级2.为什么会存在优先级3.看看Linux怎么做的4.查看进程优先级的命令😊进程的一些特性➡️进程切换➡️进程优先级 1.什么叫做优先级 优先级和权限有些区别,权限决定能还是不能,优先级的前提是能&#xff0…

计算机存储器之逻辑地址和物理地址转换详解

文章目录1 概述2 转换2.1 逻辑地址 to 物理地址2.2 物理地址 to 逻辑地址3 扩展3.1 在线进制转换1 概述 #mermaid-svg-zTbJ3rKuirwBssRU {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-zTbJ3rKuirwBssRU .error-ico…

Zookeeper-全面详解(学习总结---从入门到深化)

目录 Zookeeper概念_集中式到分布式 单机架构 集群架构 什么是分布式 三者区别 Zookeeper概念_CAP定理 分区容错性 一致性 可用性 一致性和可用性的矛盾 Zookeeper概念_什么是Zookeeper 分布式架构 Zookeeper从何而来 Zookeeper介绍 Zookeeper概念_应用场景 数据发布/订阅 实…