【Linux】Linux编译器-gcc/g++的使用和程序执行的基础底层原理

news2025/1/10 1:31:50

Linux编译器

  • 1.gcc/g++ 的使用
  • 2. 程序的基本翻译过程
  • 3.预处理
    • 3.1验证预处理的功能(gcc -E)
  • 4.编译(变成汇编语言)
    • 4.1验证编译过程(gcc -S)
  • 5.汇编(生成机器可识别代码)
    • 5.1验证汇编过程(gcc -c)
  • 6.链接(生成可以执行文件)
  • 7.总结

1.gcc/g++ 的使用

gcc在Linux下负责编译C语言,g++主要负责编译C++,当然也兼容C语言。

我们先来以gcc为例子,看看怎么直接利用gcc编译我们代码
现在我们已经利用了vim编译器写好了代码,cat查看我们的代码,是要打印Hello World
在这里插入图片描述

接下来我们直接 输入 gcc myc.c 即可编译生成可执行程序,默认生成
a.out
在这里插入图片描述

接下来我们直接输入 ./a.out 运行即可
在这里插入图片描述
可以看到代码成功编译并执行了。

如果我们不想默认编译后生成a.out这个名称 我们可以在编译的时候可以这么输入: gcc -o myc myc.c
(myc可以改成你想要的名称)
可以看到myc也是可执行程序
在这里插入图片描述

以上是gcc使用方法
本篇文章主要讲的是一段程序执行的四个过程。

2. 程序的基本翻译过程

一段代码的执行可分为以下四个过程

1.预处理(进行宏替换等操作)
2.编译(生成汇编语言)
3.汇编(生成机器可识别码)
4.链接(生成可执行文件或库文件)

接下来我们逐一分析这四个过程的底层原理

3.预处理

预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是以#号开头的代码行。

3.1验证预处理的功能(gcc -E)

因为代码如果直接gcc + C源文件的话,会直接把上面四个过程一下子执行完。 我们需要加上 -E 选项,只看预处理的功能,而不会一下子完四个过程。

-E:从现在开始进行程序的翻译,预处理做完,就停下来

接下来开始验证

我们先在myc.c里面加上宏定义,文件包含,条件编译,注释操作

在这里插入图片描述

然后输入
gcc -E -o myc.i myc.c
表示只执行到预处理并查看预处理后的文件,把该文件的内容放到 myc.i中

在这里插入图片描述

接下来,我们直接查看myc.i的内容
可以看到预处理后,本来只有几行的代码变成了800多行,因为我们的头文件在这里被展开了,宏定义和条件编译也被直接展开了,注释也不见了。

在这里插入图片描述

所以预处理这个阶段,会把代码变得更直接,更干净一些。
预处理阶段的代码还是我们的C语言代码。

4.编译(变成汇编语言)

4.1验证编译过程(gcc -S)

同样地,我们需要 -S 选项,验证编译过程

-S:从现在开始进行程序的翻译,编译做完就停下来

我们进行以下操作
gcc -S -o myc.s myc.i (这里用.i或者.c都行,因为.i是预处理阶段的文件)
当然也可以直接
gcc -S myc.i ,会默认生成myc.s文件
我们用vim查看myc.s文件

在这里插入图片描述

可以看到,我们的代码变成了汇编语言

在这里插入图片描述

5.汇编(生成机器可识别代码)

(汇编 -> 可重定位目标二进制文件,不可以被执行的 .obj文件) 这个阶段只把我们自己的代码进行翻译形成二进制目标文件

5.1验证汇编过程(gcc -c)

同样地,我们需要用 -c 选项验证汇编的过程

-c 从现在开始进行的程序的翻译,汇编做完就停下来。

我们输入gcc -c myc.s (当然也可以直接使用myc.c文件),这里的myc.s是上次已经编译好的。

这里会默认生成一个.o文件,也就是.obj文件

在这里插入图片描述

我们使用vim myc.s 打开这个文件
可以看到都是一堆乱码,这是一个二进制目标文件在这里插入图片描述

6.链接(生成可以执行文件)

链接过程是把我们自己的.obj文件和库文件进行某种合并,形成可执行程序。编译器会自动寻找库文件完成链接,具体是如何完成的,可以看看我的其他文章。
gcc + obj文件
可以看到,确实生成了,a.out这个可执行文件

在这里插入图片描述

成功执行代码

在这里插入图片描述

我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用

7.总结

所以即使是一段简单的打印Hello World程序,其底层原理也是非常复杂的,在这里只是简单地演示了程序执行的四个过程。
1.预处理
2.编译
3.汇编
4.链接
才能生成我们的可执行程序,而不是表面上简单地我们动动鼠标点击编译并运行就能完成的,那样只看到了事物的表面。我们要把一个东西学好就要知其然,也要知其所以然。
链接这个过程具体要用到动态库和静态库,可以看看
动态库和静态库这篇文章

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

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

相关文章

K_A11_002 基于STM32等单片机驱动DS18B20串口与OLED0.96双显示

K_A11_002 基于STM32等单片机驱动DS18B20 串口与OLED0.96双显示一、资源说明二、基本参数1.参数2.引脚说明三、驱动说明时序对应程序:四、部分代码说明1、接线说明1.1、STC89C52RCDHT11模块1.2、STM32F103C8T6DHT11模块五、基础知识学习与相关资料下载六、视频效果展示与程序资…

内核解读之内存管理(4)内存管理三级架构之page

我们前面介绍了linux内存管理的三级架构,node->zone->page。本节就来介绍page。 页是内核管理内存的基本单位,体系结构不同,支持的页大小也不尽相同,还有些体系结构甚至支持几种不同的页大小。大多数32位体系结构支持4KB的页…

【Python】爬取弹幕并保存到Excel中

hello,我是李华同学,最近开始学习爬虫,下面是我实现的一个得到弹幕的代码😏找一个URL👉想要得到一个网站的内容,首先要找到你想要内容的具体位置,首先你先找到一个有弹幕的地方,找到…

linux系统重装yum工具与python环境

文章目录前言一、强制删除原有环境1.删除python2.删除yum二、安装新环境前置准备三、下载依赖命令1.内核版本7.6.1810下载python依赖包下载yum包2.内核版本7.4.1708下载python依赖包下载yum包3.内核版本7.8.2003下载python依赖包下载yum依赖包4.下载结果四、安装前言 安装之前…

swagger入门

目录 1.前后端分离的特点 2.在没有swagger之前 3.swagger的作用 4.swagger的优点 5.集成swagger 5.1 新建springboot项目 5.2 集成swagger 5.3 开发一个controller用于测试 5.4 启动服务,验证集成效果 6.swagger常用注解 7.swagger使用综合案例 8.会议OA之sw…

第三章 Flink DataStream API

Flink 系列教程传送门 第一章 Flink 简介 第二章 Flink 环境部署 第三章 Flink DataStream API 第四章 Flink 窗口和水位线 第五章 Flink Table API&SQL 第六章 新闻热搜实时分析系统 一、DataStream API是什么? Flink 中的 DataStream 程序是对数据流&a…

Android 深入系统完全讲解(2)

1 系统启动过程、嵌入式系统启动过程 这是我之前画的启动过程的图,这个主要就是给大家讲明白,启动过程整个的流程。 第一个阶段,bootloader 系统在上电的时候,系统会从固定的地方加载一段代码进入内部 ram 进行运行。这段代码 通…

【数学思维】Quasi-convex and quesi-concave

【数学思维】Quasi-convex and quesi-concaveConvex function 定义如下 f(λx(1−λ)y)≤λf(x)(1−λ)f(y)f(\lambda x(1-\lambda)y)\le \lambda f(x)(1-\lambda)f(y) f(λx(1−λ)y)≤λf(x)(1−λ)f(y)Quasi-convex function 定义如下 f(λx(1−λ)y)≤max⁡{f(x),f(y)}f(\l…

【阶段三】Python机器学习01篇:机器学习概念、机器学习类别、机器学习应用场景与机器学习基本技术:特征、标签、模型

本篇的思维导图: 机器学习概念 机器学习是AI人工智能的分支技术,而深度学习是机器学习的重要分支。 人工智能、机器学习、深度学习三者的关系 机器学习就是从数据中发现规律,机器学习的关键内涵之一在于利用计算机的运算能力从大量的数据中发现一个“函数”或…

Linux——VMware Tools的介绍及安装方法

一、VMware Tools的作用 1.最大的好处是可以直接把windows界面的文件拖进linux虚拟机内。 2.鼠标可以直接从虚拟机移动到windows等等好处。 二、VMware Tools的安装步骤 1.首先把linux虚拟机关机或退出,然后点击“编辑虚拟机设置”。 2.点击CD/DVD,…

电子、半导体废水深度除氟、除重金属的技术详解

电子半导体行业废水来源及水质特点电子废水主要是印刷线路板中每个环节产生的废水,如线路板上的赋铜线路、电子元器件、二极管、三极管、电容等,日常生活中常见的就是电脑元器件,如内存条、CPU、主板等。这些东西在生产成型的过程中主要通过电…

968. 监控二叉树

题目 分析 首先明确把摄像头放在叶子节点的父节点位置,才能充分利用摄像头的覆盖面积。 贪心算法: 从下到上看局部最优,因为下面的节点最多,让叶子节点的父节点安摄像头最合理,所用摄像头最少。 整体全局最优&#xf…

基于融合SPD+BIFPN+CBAM改进YOLOv5的奶牛检测识别分析系统开发

在我之前的几篇文章中分别应用了不同的tricks来改进yolov5模型如下:加入针对小目标的SPD-Conv模块《yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别》加入BIFPN特征融合模块《基于yolov5sbifpn实践隧道裂缝裂痕检测》加入注意力机制模…

[数据结构]栈和队列

目录[数据结构]栈和队列一.栈1.栈的基本概念1.2 栈的常见基本操作1.3 栈的实现1.3.1 入栈1.3.2 出栈1.3.3获取栈顶元素1.3.4 判断栈为空1.3.5 栈实现二.队列2.1 入队2.2 出队2.3 获取队首元素2.4 实现队列[数据结构]栈和队列 一.栈 1.栈的基本概念 栈(Stack&#…

你了解真正的数字孪生吗?

数字孪生的目的是在虚拟空间构建数字化的复杂系统“镜像”,可以低成本、反复的从多个视角观察、控制、分析、验证和推演,从而帮助人们更好的在现实世界中完成设计、生产、运营等活动。 近年来,数字孪生技术在航空航天、工业制造、交通物流等多…

hbase2.x HBCK Report Region Holes Overlaps问题修复

Region Holes 查看该问题可通过master UI界面的HBCK Report查看 最下方RegionInfo展示了哪两个region之间存在空洞 也可以通过master日志查看 解决步骤 解决方法很简单,直接使用 hbck2 提供的 fixMeta 操作即可。 在 Usage 说明中能看到 fixMeta 能够修复 ‘…

【Linux】make/Makefile的使用

本文目录 背景简介 使用方法 为什么执行的指令是make和make clean呢? gcc如何判断文件是否需要重新执行? 背景简介 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefifile定义了一系列的规则来指定…

16万字智慧医疗-医院信息化大数据建设 方案

【版权声明】本资料来源网络,知识分享,仅供个人学习,请勿商用。【侵删致歉】如有侵权请联系小编,将在收到信息后第一时间删除!完整资料领取见文末,部分资料内容: 目 录 1 概述 1.1 现状分析 …

人工智能-网络编程、TCP

目录1、网络编程1.1网络介绍1.2IP地址1.3 ifconfig和ping命名1.4端口和端口号1.5端口号的分类1.6 socket介绍1.7 TCP介绍2、TCP的网络应用程序开发2.1 python3编码转换2.2 TCP客户端程序开发流程2.3 TCP客户端程序开发2.4 TCP服务端程序开发流程2.5 TCP…

[Android]序列化原理Parcelable

Parcelable是Android为我们提供的序列化的接口,Parcelable相对于Serializable的使用相对复杂一些,但Parcelable的效率相对Serializable也高很多,这一直是Google工程师引以为傲的,Parcelable和Serializable的效率对比Parcelable vs…