Linux中详解编译原理每一步

news2024/11/27 3:43:34

引言:

时间过的飞快,可以看出我们已经开始学习Linux了,但是我们学习Linux过程中,依然会涉及到很多的以前的知识,比如编译原理,我们的代码如何从一个源文件逐步变成一个可执行文件,当初我记得我在哔哩哔哩上看鹏哥的免费的C语言的课的时候,C语言的最后一节课讲的就是编译原理的内容,但是随着时间的流逝,我们应该可以发现,我们对这方面的知识是比较的薄弱的,我感觉我都快忘记有这个东西了,更不要说具体的过程和原理了。所以今天让我们借着Linux操作系统,我们来复习一下我们的编译原理并且进一步的掌握。当时鹏哥讲的时候用的就会Linux操作系统给我们上的课,只是因为当时我们并没有学习Linux,所以我们对鹏哥的一些讲解的过程可以说是非常的盲目的,很多东西都是学的一知半解,但是今天的我们是有Linux操作系统的我们,所以接下来我们就使用我们的Linux来进一步的学习编译原理这块内容。

创建文件

首先我们在学习C语言的时候,我们都知道,我们在使用VS写代码的时候,我们都需要创建一个工程,创建一个源文件,并且身为比特人我们一般都会把这个源文件的名称设置为万年不朽的:test.c这个文件可以说是计算机专业的学生在学习过程中的一个必建文件了,但是我们关注的并不是文件的名称,我们比较关注的是它的后缀(.c),所以下述我们的讲解过程,我们就把我们的源文件称为test.c

编写代码

身为计算机专业的我们,编写代码可以说是我们最重要的事情,没有之一,所以当我们创建好了文件之后,我们要进行的就是代码的编写,写出正确的,高效的,安全的代码就是我们的目标。当然这个是一个需要日积月累的过程,无论是笔试中的做题,还是学习过程中的练习。我们一定要相信自己,孰能生巧是真的。

编译代码

每当我们写完了我们的代码,我们通常是会进行一个编译的过程,从而判断我们自己的代码是否是正确的,合理的,符合标准的,我们通常就是进行(Ctrl+F5)的操作,但是当我们按下了这两个按钮之后,会发现我们需要等待几秒之后,才会在我们的显示屏上看到我们程序的运行结果。
显然我们等待的那几秒,我们的编译器帮助我们完成了编译的过程,但是在我们前期写代码的时候,我们只需要会进行Ctrl+F5的操作就行了,我们这个叫做知其然。
但是古话说的好,知其然还要知其所以然,所以我们顺理成章的可以展开接下来的话题:

编译的具体原理

【我们的所以然】
编译原理包括:预处理、编译、汇编、链接

源文件(后缀.c)
预处理(后缀.i)
编译(后缀.s)
汇编(后缀.o)
链接

我们现在就逐一开始具体理解,当然此时我们是在Linux的环境下

预处理

指令:gcc -E test.c -o test.i ------ 表示:将我的test.c文件进行预处理完之后,再把预处理之后的代码存到test.i中
这样我们就得到了预处理之后的test.i文件了(我们就可以进到文件之中看一下我们自己的代码和预处理之后的代码的区别了)

打开后如图:test.i
在这里插入图片描述
看到上述图片,我们对照着图片进行对比式讲解
相信大家从小就知道找不同游戏,我们今天就也来玩一玩找不同游戏,回归童年

不同点1:我的源文件只有29行代码,而我的tesst.i文件却有865行代码
不同点2:在我的main函数上方多了一串代码
不同点3:在我的main函数中我的相关代码的内容发生了改变,我的注释代码被清除了
不同点4:我的 #define N 20 被替换到了相应的数组中
不同点5:我们的判断条件printf (“hello newday”)被执行了

所以我们此时可以去打开我们的stdio.h头文件中看一看
指令:vim stdio.h
发现:我的stdio.h就是我的test.i文件中的前面的内容
我大致的截取一些,如果全部接下来是非常的占用位置,所以……
在这里插入图片描述

所以根据以上证据,我可以证明,我们的预处理生成test.i文件

包括了头文件的展开合并到源文件这个步骤
并且根据第二个不同点,得到预处理包括去注释的功能
根据第四个不同点,得到预处理包括宏替换的功能
根据第五个不同点,得到条件会被直接编译的功能
总结:预处理包括头文件的展开合并到源文件,条件编译,宏替换,去注释等

编译

指令:gcc -S test.i -o test.s => 表示:将我预处理之后的test.i文件进行C语言转换成汇编语言,然后把转换成汇编语言之后的文件存到test.s文件中, 这样我们就得到了C语言转换为汇编语言之后的test.s文件了(我们就可以进到文件之中看一下C语言变成汇编语言之后是什么样子的了)

打开文件图片:test.s
在这里插入图片描述
上述就是我么的test.s文件中的内容,也就是test.i文件变成了test.s文件
也就是把我们的C语言转换成了一个我们更加看不懂的语言(汇编语言

汇编

指令:gcc -c test.s -o test.o => 表示:将我的汇编语言文件转换成一个二进制的文件,然后把这个二进制的文件存到test.o文件中
这样我们就得到了汇编语言变成二进制test.o文件了(我们就可以进到文件之中看一下此时的test.o文件是长什么样了)

打开后的图片:test.o
在这里插入图片描述
此时这个就是我们的二进制文件,更看不懂
但是注意:此时的这个test.o 文件是一个不可执行文件(因为:还没有进行链接)
所以我们可以发现,编译过程是为了让你更加的看不懂,从而让电脑更加的看的懂的过程

链接

具体链接过程如图:
在这里插入图片描述
链接过程无明显现象,我们不做过多解释

但是如下图:
在这里插入图片描述
我们可以知道在链接过程其实是调用了我们的C语言库的 libc-2.17.so

大总结:编译过程是为了让你更加的看不懂,从而让电脑更加的看的懂的过程

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

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

相关文章

流批一体计算引擎-8-[Flink]的Table API连接器

参考官方文档Table API连接器 1 Table API连接器概述 Flink的Table API和SQL程序可以连接到其他外部系统,用于读取和写入批处理表和流式表。source表提供对存储在外部系统(如数据库、键值存储、消息队列或文件系统)中的数据的访问。sink表将…

Sentienl学习笔记

PS:本文为作者学习黑马程序员Springcould视频笔记实际技术参考价值不大,文章将持续更新。 文章目录一. 什么是Sentienl1. 介绍2. 与Hystrix对比3. 主要特性二. Sentienl安装配置1. 下载安装包2. 启动三. Sentienl的使用1. Sentienl的整合2. 簇点链路四. …

每日学术速递1.27

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 前沿推介: ICLR 2023 ICLR 全称为国际学习表征会议(International Conference on Learning Representations),今年将举办的是第 11 届,预计将于 5 月 1 日至 5 …

Redis实现附近商铺 | 黑马点评

一、GEO数据结构 1、入门 GEO是Geolocation的缩写,代表地理坐标。redis3.2中加入对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。 常见命令: GEOADD:添加一个地理空间信息,包含&…

springcloud3 Sentinel的服务熔断操作

一 服务熔断 1.1 服务熔断 Sentinel熔断降级会在调用链路中某个资源出现不稳定状态时(调用超时或者异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其他资源进而导致级联错误。 当资源被降级后&…

07_linux中断控制

裸机开发要点 通用中断控制器(GIC) 中断类型、硬件中断号、分发器和cpu接口单元 中断向量表 一级查表、二级查表 中断处理流程 进入irq模式、保护现场、获取硬件中断编号、执行中断处理函数、还原现场 设备树构造 分为 gic中断控制器设备树节点 其他外设中断控制器节点 需要…

大数据相关组件

一、 HDFSHDFS是hadoop的核心组件,HDFS上的文件被分成块进行存储,默认块的大小是64M,块是文件存储处理的逻辑单元。HDFS是Master和Slave的结构。分NameNode、SecondaryNameNode、DataNode这几个角色。NameNode:是Master节点&#…

springcloud3 Sentinel的搭建以及案例操作

一 sentinel的概念 1.1 sentinel Sentinel是分布式系统流量控制的哨兵,阿里开源的一套服务容错的综合性解决方案。 主要用来处理: 服务降级 服务熔断 超时处理 流量控制 sentinel 的使用可以分为两个部分: 核心库(Java 客户端&#…

基于nodejs+vue的留学服务管理平台的设计与开发

目 录 摘 要 I Abstract I 第一章 绪论 1 1.1系统开发的背景 1 1.2系统开发的意义 1 1.3本文研究内容 2 第二章 系统开发技术 3 第三章 系统分析 6 3.1用户需求分析 6 3.1.1 老师用户 6 3.1.2 学生用户 6 3.1.3 管理员用户 6 3.2 系统…

6--总线

文章目录一.总线概述(一)总线特性(二)总线分类1.按功能分/按连接的部件分(1)片内总线/CPU内部总线(2)系统总线(3)通信总线/外部总线2.按数据传输格式分&#…

7、关系运算符与关系表达式

目录 一、关系运算符 二、关系表达式 三、优先级与结合性 一、关系运算符 关系运算符包括大于、大于等于、小于、小于等于、等于和不等于 注意&#xff1a;符号“>”&#xff08;大于等于&#xff09;与“<”&#xff08;小于等于&#xff09;的意思分别是大于或等于…

向QAbstractItemView子类如:QTreeView、QTableView等子项单元格插入窗体小部件的功能实现(第3种方法)

1.前言工作中经常会遇到这样的需求&#xff1a;向QAbstractItemView子类如QTreeView、QTableView单元格插入窗体小部件&#xff0c;如&#xff1a;进度条、按钮、单行编辑框等。下面链接的系列博文就是讲解如何实现该功能的。《向QAbstractItemView子类如:QTreeView、QTableVie…

Java 23种设计模式(9.结构型模式-外观模式)

结构型模式-外观模式 代码详解 类图 代码 public class SubOne {public void method1(){System.out.println("method1");} }public class SubTwo {public void method2(){System.out.println("method2");} }public class SubThree {public void method3(…

VSCode配置C/C++环境

(1).配置编译器 接下来配置编译器路径&#xff0c;按快捷键CtrlShiftP调出命令面板&#xff0c;输入C/C&#xff0c;选择“Edit Configurations(UI)”进入配置。这里配置两个选项&#xff1a; - 编译器路径&#xff1a;D:/mingw-w64/x86_64-8.1.0-win32-seh-rt_v6-rev0/mingw64…

3D创作元素将入住下一代Windows 10和HoloLens中

新 Windows 10 将会带来崭新的 3D 特性&#xff0c;任何用户都可以通过内置的工具来制作发布有关「3D、增强现实 AR 和混合现实 (mixed reality) 的游戏和素材」。 北京时间 10 月 26 号晚 10 点&#xff0c;微软在纽约召开的新品发布会如期而至。会上微软发布了大家期待已久的…

【Linux】进程的概念 | 进程控制块 PCB | task_struct

&#x1f923; 爆笑教程 &#x1f449; 《看表情包学Linux》&#x1f448; 猛戳订阅 &#x1f525; &#x1f4ad; 写在前面&#xff1a;本章我们将带着大家深入理解 "进程" 的概念&#xff0c;"进程" 这个概念其实使我们一直在接触的东西&#xff0c;只不…

浅谈操作系统

操作系统是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互的相互关联的系统软件程序。根据运行的环境&#xff0c;操作系统可以分为桌面操作系统&#xff0c;手机操作系统&#xff0c;服务器操作系统&#xff0c;嵌入式操作系统等。 通俗来…

Three.js坐标系与变换矩阵快速入门

很多东西汇集在一起构成一个美丽的 3D 场景&#xff0c;例如光照、材质、模型、纹理、相机设置、后期处理、粒子效果、交互性等等&#xff0c;但无论我们创建什么样的场景&#xff0c;没有比这更多的了 比组成它的乐曲的排列和运动更重要。 要创建建筑效果图&#xff0c;我们必…

CDH数仓项目(一) —— CDH安装部署搭建详细流程

0 说明 本文以CDH搭建数据仓库&#xff0c;基于三台阿里云服务器从零开始搭建CDH集群&#xff0c;节点配置信息如下&#xff1a; 节点内存安装服务角色chen10216Gcloudera-scm-serverchen1038Gcloudera-scm-agentchen1048Gcloudera-scm-agent 上传需要用到的安装包&#xff1…

[NPUCTF2020]ezinclude

目录 前提知识 信息收集 解题思路 前提知识 PHP LFI 利用临时文件 Getshell 姿势-安全客 - 安全资讯平台 PHP LFI 利用临时文件Get shell php7 Segment Fault&#xff08;7.0.0 < PHP Version < 7.0.28&#xff09; PHPINFO特性 信息收集 查看源码 <!--md5($secr…