【Linux】gcc编译过程和gdb调试

2023-11-06

目录

一、什么是gcc?

二、gcc编译程序的过程

三、gcc命令使用

1.预处理

2. 编译

3.汇编

4.链接

 四、gcc常用选项

五、什么是gdb?

六、gdb功能

七、gdb用法


一、什么是gcc?

gcc是GNU Compiler Collection的缩写。最初是作为C语言的编译器,现在已经支持多种语言了,如C、Java、Pascal、Ada、COBOL语言等;

可以运行各种liunx 发行版,BSD,以及solaris等多种操作系统,并能够编译X86,X86-64等不同硬件平台上。还可以实现不同平台上的交叉编译,如在liunx平台上编译windows下的可用的软件

二、gcc编译程序的过程

预处理( Pre-Processing
编译( Compiling
汇编( Assembling
链接( Linking

gcc编译程序过程示意图:

三、gcc命令使用

1.预处理

C编译器对各种预处理命令进行处理

//预处理c文件
gcc -E hello.c -o hello.i

预处理过程:

  • 将所有的#define删除,并且展开所有的宏定义
  • 处理所有的条件预编译指令,比如#if 、#ifdef、#elif、#else、#endif等
  • 处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。
  • 删除所有注释“//”和“ /* */”
  • 添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号。
  • 保留所有的#pragma编译器指令,因为编译器需要使用它们

2. 编译

将预处理得到的源代码文件,进行“翻译转换”,产生出机器语言的目标程序,得到机器语言的汇编文件,后缀是.s

//编译成汇编文件
gcc -S hello.i -o hello.s

3.汇编

将汇编代码翻译成了机器码,后缀是.o文件

gcc -c hello.s -o hello.o

4.链接

把各种符号引用和符号定义转换成为可执行文件中的合适信息,后缀是 .out 文件或可执行文件

gcc hello.o -o hello

通常我们可以一步到位,直接编译链接成可执行文件

gcc hello.c -o hello

把所有.c文件编译链接成可执行文件main 

​ 

 四、gcc常用选项

选项名

作用

-o

产生目标代码或可执行文件

-c

通知gcc取消链接步骤,即编译源码并在最后生成目标文件

-E

只运行C预编译器

-S

告诉编译器产生汇编语言文件后停止编译,产生的汇编语言文件扩展名为.s

-Idir

dir目录加入搜索头文件的目录路径

-Ldir

dir目录加入搜索库的目录路径

-llib

链接lib

-g

在目标文件中嵌入调试信息,以便gdb之类的调试程序调试

-Wall

使gcc对源文件的代码有问题的地方发出警告

五、什么是gdb?

gdb是GNU debugger的缩写,是编程调试工具

六、gdb功能

  • 启动程序,可以按照用户自定义的要求随心所欲的运行程序。
  • 可让被调试的程序在用户所指定的调试的断点处停住 (断点可以是条件表达式)
  • 当程序停住时,可以检查此时程序中所发生的事
  • 动态地改变程序的执行环境

七、gdb用法

命令

含义

list(l)

列出源代码

breakb)

设置断点

info break

查看断点信息 info functions

run(r)

运行

continue(c)

继续程序运行,直到下一个断点

step(s)

单步跟踪,类似于VC中的step into

nextn)

单步跟踪,类似于VC中的step over

finish

运行程序,直到当前函数返回

util(u)

退出循环

printp)

查看运行时的变量以及表达式

watch

设置观察点

示例:

注意:运用gdb的时候需要编译时加上之前图片中有提到的-g选项,在目标文件中嵌入调试信息,以便gdb之类的调试程序调试

l列出源代码,b设置断点,r运行,n单步跟踪   

感谢观看!!!!

以上就是全部内容,如果对您有帮助,欢迎点赞评论,或者发现有哪里写错的,欢迎指正!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Linux】gcc编译过程和gdb调试 的相关文章

  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li

随机推荐

  • mongod连接数据库被拒绝

    这周想着写一下实训项目 但是连接数据库的时候无论如何都连接不上 问题是单独写了一个连接文件运行时是可以连接上的 但是在那个项目里边一直显示连接被拒绝 const mongoose require mongoose 链接数据库 mongoos
  • 计算机网络--谢希仁--重要知识点整理

    由于我近期在复习计算机网络的时候无意间在网上发现了一个比较不错的文章 这位大佬归纳得很详细 所以我在这边转载一下分享给大家 文章作者 烟雨迷离半世殇 文章链接 计算机网络重点知识整理 烟雨迷离半世殇的成长之路 雄关漫道真如铁 而今迈步从头越
  • python Hill密码

    以下python代码用于生成Hill密码的密钥矩阵及其逆矩阵 PydevCodeAnalysisIgnore input N output a pair of matrix which is inverse matrix of anothe
  • epoll基本原理及使用框架

    epoll基本原理及使用框架 epoll是Linux下多路复用IO接口select poll的增强版本 它能显著减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率 因为它不会复用文件描述符集合来传递结果而迫使开发者每次等待事件之
  • 从零玩转系列之微信支付实战PC端接口搭建

    一 前言 halo各位大佬很久没更新了最近在搞微信支付 因商户号审核了我半个月和小程序认证也找了资料并且将商户号和小程序进行关联 至此微信支付Native支付完成 此篇文章过长我将分几个阶段的文章发布 项目源码都有 小程序和PC端 在此之前
  • 毕业设计-基于机器视觉的回转体零件表面缺陷检测研究-OpenCV

    目录 前言 课题背景和意义 实现技术思路 一 回转体零件的图像预处理 二 图像分割 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要
  • elementUI中el-tabs组件接口多次请求解决方案

    首先看代码
  • 软件测试学习路线-基础篇

    目录 功能测试 自动化测试Selenium和Appium 接口测试Jmeter 性能测试Loadrunner 软件测试自学实践部分比较难 因为需要找到有问题的源代码进行测试 更建议跟团队一起学习 下面讲讲软件测试的学习路线 希望对你有所帮助
  • Go项目配置管理工具---Viper

    目录 Viper概述 前言 功能 viper配置优先级 从Viper中获取值 读取配置文件 注册和使用别名 把值写入Viper 设置默认值 使用Set方法设置值 把配置信息写入配置文件 从io Reader中读取配置信息到viper 监控V
  • JetBrains注解@NotNull/@Nullable/@Contract

    JetBrains 的注解库 然后通过在 IDE 里面提示你处理那些可能为 null 的值 编译器没法检查并提示 避免NullPointerException 对于空指针异常 Java 只有 IDE 警告 正式名称叫 inferred an
  • 性能测试用什么工具?3分钟了解自动化测试工具Parasoft和LoadRunner的功能对比

    本文是自动化测试工具Parasoft功能对比之SOAtest测试篇之一 将介绍Parasoft SOATest和同类工具LoadRunner的功能对比 哪一款更强大一目了然 如果你想试用Parasoft的强大功能 可以申请Parasoft测
  • Could not connect to SMTP host: smtp.163.com, port: 25;阿里云 ECS

    ECS基于安全考虑 目前已禁用25端口 如果您的发送程序部署在阿里云ECS上 建议您不勾选SSL时 使用80端口 勾选SSL时 使用465端口 测试端口 telnet smtp 163 com 25 测试网络 ping smtp 163 c
  • Python由用户输入学生学号与姓名,数据用字典存储,最终输出学生信息(按学号由小到大显示)

    Python字典存储学生信息 且排序 由用户输入学生学号与姓名 数据用字典存储 最终输出学生信息 按学号由小到大显示 students while 1 student input 请输入学号 输入q停止输入信息 if student q b
  • 雷电模拟器谷歌套件安装的时候总是卡着转圈圈

    雷电模拟器安装谷歌套件 安装的时候总是卡着转圈圈 尝试开启网卡桥接 不过依然不行 最后各种把电脑的网络折腾切换 依然不行 开始的想法是觉得虚拟机的网络应该是串用电脑网络的 可是最后发现这样并不行 虚拟机并不能直接使用宿主机的网络环境 最后想
  • react的优化方法

    目录 1 render里面尽量减少新建变量和bind函数 传递参数是尽量减少传递参数的数量 2 定制shouldComponentUpdate函数 3 使用React PureComponent 4 使用React memo来缓存组件 5
  • Mysql使用sql语句建表

    Mysql使用sql语句建表 显示数据库列表 建库 删库 显示列表 删表 显示数据库列表 show databases 建库 create database 库名 删库 drop database 库名 建表 create table 表名
  • Ag-Grid React入门

    Ag Grid和React兼容性 react Ag Grid 15 x 18 21 2 0 16 3X 22 安装 npm install save ag grid community ag grid react ag grid enter
  • 2023 年Windows MySql 5.7,MySql 8.0 下载安装教程, 附详细图解,亲测可用

    文章目录 下载 MySQL 安装程序 安装 MySQL 数据库 安装示例数据库 连接到 MySQL 服务器 在本教程中 我们展示如何在 Windows 平台上下载和安装 MySQL 的详细步骤 在 Windows 平台上安装 MySQL 很
  • 手动实践一下react的forwardRef到底有啥作用

    首先 我们来看一下这个函数的使用实例 const Son1 React forwardRef props ref gt return div p this input is from Son1 p div
  • 【Linux】gcc编译过程和gdb调试

    目录 一 什么是gcc 二 gcc编译程序的过程 三 gcc命令使用 1 预处理 2 编译 3 汇编 4 链接 四 gcc常用选项 五 什么是gdb 六 gdb功能 七 gdb用法 一 什么是gcc gcc是GNU Compiler Col