当前位置: 首页 > news >正文

【Hello Linux】Linux工具介绍 (gcc/g++ gdb)

作者:@小萌新
专栏:@Linux
作者简介:大二学生 希望能和大家一起进步!
本篇博客简介:介绍Linux的常用工具gcc/g++ 以及gbd

Linux工具介绍

  • gcc / g++
    • gcc / g++的作用
    • 为什么语言要经过这四步才能变为可执行指令
    • gcc / g++语法
    • 预处理
    • 编译
    • 汇编
    • 链接
    • 动态库和静态库
  • gdb
    • debug和release
    • gdb指令

gcc / g++

gcc / g++的作用

gcc和g++分别是GNU的C和C++的编译器

我们都知道语言从源文件到可执行指令要分为以下四个步骤

  1. 预处理 (去除注释 头文件展开 宏替换 条件编译)
  2. 编译 (将c/c++ 代码翻译成汇编代码)
  3. 汇编 (将汇编代码转化为二进制语言)
  4. 链接 (将汇编过程产生的二进制语言进行连接)

为什么语言要经过这四步才能变为可执行指令

我们在上一些语言课的时候 一些学校里的教授可能跟我们讲过它们那个年代是怎么进行编程的

打孔编程

在这里插入图片描述

不过后面人们发现 这种打孔编程的指令很难让人记住并且效率极其低下 于是乎人们便发明出了汇编语言

从此之后我们变开始用汇编语言进行代码编程

汇编的语言的编译过程是这样子的

在这里插入图片描述

之后呢随着时代的进步 人们认为汇编语言还是太过复杂了 于是乎c语言就被发明出来了

之后c语言想要变成二进制文件就有两条路

在这里插入图片描述

c语言是直接变成二进制文件简单一点还是先变成汇编语言再变成二进制文件简单一点?

很显然 如果直接从c语言直接变成二进制文件的话等于前面几十年的努力全部被白费了

但是如果先变成汇编语言的话就简单很多 而且汇编语言变成二进制文件也是可以借鉴之前的经验的

在这里插入图片描述

当然由于C语言的编写中可能会存在大量的注释以及头文件的展开等

所以我们还需要预处理这一步骤将注释全部清除 将头文件展开

gcc / g++语法

我们常用的gcc语法是这样子的

gcc/g++ 选项 文件

下面是gcc g++的一些选项 其中前面七个选择特别重要 需要记住

  1. -E 只进行预处理 不生成文件 你需要把他重定向到一个输出文件里面(否则将把预处理后的结果打印到屏幕上)
  2. -S 编译到汇编语言
  3. -c 编译到目标代码(二进制文件)
  4. -o 将处理结果输出到指定文件 该选项后需紧跟输出文件名
  5. -static 此选项对生成的文件采用静态链接
  6. -shared 此选项将尽量使用动态库,生成文件较小
  7. -g 生成调试信息(若不携带该选项则默认生成release版本)
  8. -w 不生成任何警告信息
  9. Wall 生成所有警告信息
  10. -O0/-O1/-O2/-O3 编译器优化选项的四个级别 -O0表示没有优化 -O1为缺省值 -O3优化级别最高

预处理

预处理的作用包括下面四个

  • 去除注释
  • 头文件展开
  • 宏替换
  • 条件编译

接下来我们敲出下面的代码 让预处理之后的文件输出到test.i文件中

    gcc -E test.c -o test.i

我们分别在C文件中添加上注释 头文件 宏替换和条件编译语句

在这里插入图片描述
我们可以发现经过预处理之后代码膨胀到了800多行 这是因为头文件展开的效果

条件编译和宏替换是同步进行的 因为N是100 非0表示真 所以执行的是

hello vim!

最后我们可以发现注释也全部消除了
在这里插入图片描述

编译

编译的作用包括下面两个

代码如下

  gcc -S test.i -o test.s
  • 检查代码语法是否有错误
  • 将代码翻译成汇编语言

在这里插入图片描述
我们可以发现代码都变成汇编语言了

当然要是我们编写的代码中有一些语法的错误的话 在编译这一步就会停止

汇编

汇编的作用主要有一个

  • 将汇编语言翻译成二进制语言

代码如下

  gcc -c test.s -o test.o

在这里插入图片描述
我们可以发现这里变成了我们看不懂的乱码 实际上这里就是二进制语言

链接

链接的作用主要有一个

  • 将生成的 .o文件(二进制文件) 进行链接

代码如下

  gcc test.o -o testhv

在这里插入图片描述
之后我们便得到了一个可执行文件了

运行它 就能发现屏幕输出 hello vim!

在这里插入图片描述

动态库和静态库

函数库一般分为静态库和动态库两种:

  • 静态库是指编译链接时 把库文件的代码全部加入到可执行文件当中 因此生成的文件比较大 但在运行时也就不再需要库文件了 静态库一般以.a为后缀
  • 动态库与之相反 在编译链接时并没有把库文件的代码加入到可执行文件当中 而是在程序运行时由链接文件加载库 这样可以节省系统的开销 动态库一般以.so为后缀

映射到我们现实生活中

在这里插入图片描述
动态库就是网吧 你在宿舍里面写作业 当你遇到不会的题目的时候就回去网吧搜索 这道题目应该怎么做

而静态库就是你自己买了个电脑 以后遇到不会的题目就可以在自己宿舍查了

动态链接:

  • 优点:省空间 bin体积小 加载速度快
  • 缺点:依赖动态库 程序可移植性较差

静态链接:

  • 优点:不依赖第三方库 程序的可移植性较高
  • 缺点:浪费空间

我们的gcc/g++编译器默认使用的是动态链接

我们可以使用file指令查看

在这里插入图片描述
我们还可以使用ldd指令来查看可执行文件所依赖的库

在这里插入图片描述
其中的 /lib64/libc.so.6就是c语言标准库

我们可以使用 -static指令来强制进行静态链接

如果我们编译的过程中出现这个错误

/usr/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status

这是由于我们的云服务器中没有安装静态库引起的

这个时候我们只需要下载一下静态库就可以了

下载指令如下

sudo yum install -y glibc-static libstdc++-static

这个时候我们使用ldd指令就可以发现
在这里插入图片描述

此外 因为静态链接里面包含了整个静态库 所以说代码会膨胀很多倍

在这里插入图片描述
这也刚好证明了动态链接的优点 省空间

gdb

debug和release

我们在C语言的学习阶段就知道了程序有两种发布版本

分别是 release 和 debug

  • debug版本:程序本身会被加入更多的调试信息 以便于进行调试
  • release版本:不会添加任何调试信息 是不可调试的

我们在linux中默认生成的文件都是release版本的 是不可以使用gbd调试的

如果我们想要它可被调试则需加入debug信息

具体指令如下

  gcc test.c -o testhv_g -g

在这里插入图片描述

我们可以发现debug版本的代码确实比release代码大一点 这是因为多了调试信息

gdb指令

【进入gdb】

  • gdb 文件名

【调试】

  • 「run/r」:运行代码(启动调试)
  • 「next/n」:逐过程调试
  • 「step/s」:逐语句调试
  • 「until 行号」:跳转至指定行
  • 「finish」:执行完当前正在调用的函数后停下来
  • 「continue/c」:运行到下一个断点处
  • 「set var 变量=x」:修改变量的值为x (不常用)

【显示】

  • 「list/l n」:显示从第n行开始的源代码 每次显示10行 若n未给出则默认从上次的位置往下显示
  • 「list/l 函数名」:显示该函数的源代码
  • 「print/p 变量」:打印变量的值
  • 「print/p &变量」:打印变量的地址
  • 「print/p 表达式」:打印表达式的值 通过表达式可以修改变量的值
  • 「display 变量」:将变量加入常显示(每次停下来都显示它的值
  • 「display &变量」:将变量的地址加入常显示
  • 「undisplay 编号」:取消指定编号变量的常显示
  • 「bt」:查看各级函数调用及参数
  • 「info/i locals」:查看当前栈帧当中局部变量的值

【断点】

  • 「break/b n」:在第n行设置断点
  • 「break/b 函数名」:在某函数体内第一行设置断点
  • 「info breakpoint/b」:查看已打断点信息
  • 「delete/d 编号」:删除指定编号的断点
  • 「disable 编号」:禁用指定编号的断点
  • 「enable 编号」:启用指定编号的断点

【退出gdb】

  • 「quit/q」:退出gdb

相关文章:

【Hello Linux】Linux工具介绍 (gcc/g++ gdb)

作者:小萌新 专栏:Linux 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:介绍Linux的常用工具gcc/g 以及gbd Linux工具介绍gcc / ggcc / g的作用为什么语言要经过这四步才能变为可执行指令gcc / g语法预处理编…...

TeamFiltration:一款针对O365 AAD账号安全的测试框架

关于TeamFiltration TeamFiltration是一款针对O365 AAD账号安全的跨平台安全测试框架,在该工具的帮助下,广大研究人员可以轻松对O365 AAD账号进行枚举、喷射、过滤和后门植入等操作。TeamFiltering与CrackMapExec非常相似,它可以创建并维护一…...

你是真的“C”——Visual Studio 2022(VS2022)编译器 -—实用调试技巧

你是真的“C”——Visual Studio 2022(VS2022)编译器 -—实用调试技巧😎前言🙌1. 什么是bug?🙌2. 调试是什么?有多重要?🙌2.1 调试是什么?2.2 调试的基本步骤…...

数据结构与算法:7种必须会的排序以及3种非基于比较排序

1.什么是排序 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序…...

数据库用户数

Oracle的用户数 oracle软件内部并没对用户数做限制,买5个用户数,指你买了5个user licences,从法律上只能连5个session,超过5个的连接都是非法的。oracle不给你技术上的限制,可是给你法律上的限制。 一般来讲&#xf…...

nginx如何用html显示多个图片并加入播放链接

需求背景通过nginx来做个点播服务,ffmpeg截取视频中的某一帧作为视频的封面,前端页面展示这个封面,,并链接到对应的视频播放链接,加载播放器进行播放简单介绍一下ffmpeg截取视频中的某一帧的方式截取视频的第一帧&…...

【蓝桥杯集训·每日一题】Acwing 3729. 改变数组元素

文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴一维差分区间合并一、题目 1、原题链接 3729. 改变数组元素 2、题目描述 给定一个空数组 V 和一个整数数组 a1,a2,…,an。 现在要对数组 V 进行 n 次操作。 第 i 次操作的…...

springmvc执行流程

文章目录前言一、springMVC请求执行流程二、组件说明以下组件通常使用框架提供实现:总结前言 本篇文章是对springmvc的补充 接上篇文章springmvc入门https://blog.csdn.net/l_zl2021/article/details/127120873 一、springMVC请求执行流程 1.用户发送请求至前端控制…...

SpringMVC(2)

一)接受到JSON格式的数据:使用RequestBody来进行接收 ResponseBody表示的是返回一个非页面的数据 RequestBody表示的是后端要接受JSON格式的数据 一)接收单个格式的JSON格式的数据,我们使用一个对象来进行接收 1)我们之前接受GET请求中的queryString中的参数的时候&…...

Jackson序列化json时null转成空串或空对象

在项目中可能会遇到需要将null转"",可以通过以下方法解决。一:添加JacksonConfig 配置import com.fasterxml.jackson.core.JsonGenerator;import com.fasterxml.jackson.databind.JsonSerializer;import com.fasterxml.jackson.databind.Objec…...

如何将Python的上级目录的文件导入?【from.import】

假如有如下目录: -python ----file1 ---------file1_1 ------------------pfile1_1.py ---------pfile1.py ----file2 ---------pfile2.py ----pfile.py ----data.py 在pfile1_1.py中想要将pfile.py 导入怎么办? 首先将其上级目录添加到系统目…...

Java实现碧蓝航线连续作战

目录一.实现功能二.主要思路三.代码实现四.用exe4j生成.exe程序五.最终效果六.代码开源一.实现功能 主线图作战结束到结算页自动点击再次前往 二.主要思路 判断是否进入了结算界面:记录结算界面某个像素点的RGB值,每隔3秒对这个像素点进行比对 移动鼠标…...

Docker笔记

文章目录1.docker为什么会出现2.docker是什么3.传统虚拟机和容器的对比3.1虚拟机3.2容器虚拟化技术3.3两者对比3.4为什么Docker会比VM虚拟机快?4.docker能干嘛6.docker的应用场景7.docker三要素一:镜像(Image)二:容器&…...

情人节使用AI TOOL来创建一个甜言蜜语的女伴

一、首先使用chatgpt生成一段情侣间的对话,需要反复几次,达到满意的程度,然后将女方的话归在一起。 这是一个情侣私下谈话的场景,女方表示对男朋友精心准备的情人节安排和礼物表示很满意 二、 打开网站:https://lexic…...

G-GhostNet(IJCV 2022)原理与代码解析

paper:GhostNets on Heterogeneous Devices via Cheap Operationscode:https://github.com/huawei-noah/Efficient-AI-Backbones/blob/master/g_ghost_pytorch/g_ghost_regnet.py前言本文提出了两种轻量网路,用于CPU端的C-GhostNet和用于GPU端…...

Ethercat系列(5)TWcat3激活过程的协议分析(续1)

顺序写系统时间偏移从-》主顺序写时间延迟主-》从从-》主顺序写分布式时钟启动主-》从从-》主读多重写系统时间主-》从从-》主顺序写应用层控制主-》从从-》主顺序读错误计数器主-》从从-》主顺序读应用层状态主-》从从-》主顺序读应用层,广播写错误计数器主-》从从…...

QT入门Input Widgets之QScrollBar

目录 一、界面布局功能 1、界面位置介绍 2、控件界面基本属性 2.1 horizontalScrollBar界面属性 3、样式设置 此文为作者原创,创作不易,转载请标明出处! 一、界面布局功能 1、界面位置介绍 QScrollBar主要分为两种,一种垂直…...

【ML】基于机器学习的心脏病预测研究(附代码和数据集,多层感知机模型)

写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大努力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 之前创作过心脏病预测研究文章如下: 【ML】基于机器学习的心脏病预测研究(附代码和数据集,逻辑回归模型) 【ML】基于机…...

工序排序问题--约翰逊法精讲

什么是约翰逊法?约翰逊法是作业排序中的一种排序方法。选出最短加工时间i*,若最短加工时间有多个,任选1个.若i*出现在机床1,它对应的工件先安排加工,否则放在最后安排,安排后划去该工件,重复上两个步骤,直…...

WebDAV之葫芦儿·派盘+网盘精灵

网盘精灵 支持WebDAV方式连接葫芦儿派盘。 推荐一款让您的iPhone、iPod、iPad 变成WebDav客户端的软件,支持从WebDav服务器连接葫芦儿派盘服务进行上传和下载件。 网盘精灵让您的iPhone、iPod、iPad 变成WebDav客户端。功能:WebDav操作、文件共享、本地文件管理...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

Selenium常用函数介绍

目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统

Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...