【Linux】编译器gcc g++和调试器gdb的使用(上)

简介: 【Linux】编译器gcc g++和调试器gdb的使用(上)

1.编译器gcc/g++


1.1C语言程序的翻译过程

1.预处理

在此阶段做的事情:

  1. 头文件展开:把我们编写的代码中的包含头文件的代码替换成头文件本身
  2. 删除所有的注释
  3. #define定义的符号和宏全部替换
  4. 执行条件编译

在Linux下,我们可以通过指令让gcc只执行预处理操作

gcc -E test.c -o test.i
# -E 表示从现在开始,进行程序的翻译,当预处理结束时停下来
# -o 表示指明产生的文件的名称

61ad51d59bfdbab5c47b3d595e2a86c8.png

可以看到经过预编译之后,#include包含头文件的代码没有了,但是文件中多了几百行,这些多的就是头文件的内容被拷贝进来了,注释部分被删除,宏定义被替换了,条件编译也转变成了执行过后的结果。


2.编译

此阶段做的事情:

  • 语法分析
  • 词法分析
  • 语义分析
  • 符号汇总

最终的结果就是把C语言代码变成汇编语言代码


在Linux下需要执行的指令是:

gcc -S test.i -o test.s
# -S 表示从现在开始,执行程序的翻译,做完编译工作之后,变成汇编代码就停下来
# 变成的汇编代码的后缀名是.s

58db6687c30781714218984422ce5ec4.png

打开test.s之后我们可以发现,里面的代码意见已经变成汇编指令了。


3.汇编

此阶段做的事情:把汇编代码变成二进制(这里的二进制不是可执行的,叫做二进制目标文件)


在Linux下需要执行的指令是:

gcc -c test.s -o test.o
# -c 表示从现在开始,进行程序的翻译,做完汇编工作,变成可重定向的目标二进制,就停下来
# 重定向的目标二进制文件的后缀名是.o

e757090334229b6bb2292c093826284c.png

可以看到,此时文件内已经变成了我们看不懂的二进制代码,当他以二进制的形式打开时,是这样的

20a3c8b4bdf49ac20bd610d9df41b4e9.png

4. 链接

此阶段做的事情:把本地编写的代码和c标准库中的代码合并,形成可执行的二进制文件

  • 合并段表:编译器会把在汇编阶段生成的多个目标文件中相同格式的数据合并在一起,最终形成一个 .exe 文件。
  • 符号表的合并和重定位:符号表的合并是指编译器会把在汇编阶段生成的多个符号表合并为一个符号表;重定位则是指当同一个符号出现在两个符号表中时,编译器会选取其中和有效地址相关的那一个,舍弃另外一个


在Linux下需要执行的指令是:

gcc test.o -o mytest
# 链接阶段是程序翻译的最后一个阶段,不需要加任何选项
# 默认生成的可执行文件的文件名是a.out,我们可以通过-o选项指定

ff62597b216a56ef20b884033c9c3e9d.png

可以看到,产生的文件mytest就是可执行的程序。

注:

  1. 对于上述的几个Linux下gcc指令的选项和产生文件的后缀名,这里有一个方便记忆的小技巧,预编译、编译、链接的选项分别是ESc,对应着键盘左上角的按键Esc,产生的文件后缀名是iso,对应着光盘映像文件的后缀名
  2. 上述的分段执行只是为了方便我们能够更加细致的看到程序翻译的过程,在实际使用gcc的时候,只需要使用指令gcc 原文件名 -o 产生的可执行文件名或者gcc 原文件名即可。
相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
NoSQL Linux 编译器
GDB符号表概念和在Linux下获取符号表的方法
通过掌握这些关于GDB符号表的知识,你可以更好地管理和理解你的程序,希望这些知识可以帮助你更有效地进行调试工作。
657 16
|
NoSQL Linux 开发工具
Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)
本文介绍了yum 包管理工具、Vim 编辑器、gcc/g++ 编译器、gdb 调试器、编译原理及 Makefile 的使用,同时还配备了如何使用,以及图解。旨在帮助读者更好地理解和应用这些工具与技术。
679 0
|
NoSQL Linux 编译器
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
如何配置环境并使用QEMU虚拟机结合GDB进行Linux内核代码的断点调试,包括安装QEMU、交叉编译工具链,编译内核以及通过GDB远程连接进行调试的详细步骤。
1941 1
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
400 10
|
Linux 编译器 开发工具
Linux学习第二枪(yum,vim,g++/gcc,makefile的使用)
Linux学习第二枪(yum,vim,g++/gcc,makefile的使用)
|
IDE Linux 编译器
【Linux】gcc/g++编译器、make/Makefile自动化构建工具
目录 1.gcc/c++的概念: 2.程序编译过程详解: 2.1程序编译过程:
404 0
|
小程序 Linux 开发工具
【Linux】Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解
【Linux】Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解
|
NoSQL IDE Unix
Linux开发工具大全 - 软件包管理器yum | vim编辑器 | gcc/g++编译器 | 自动化构建工具Make/Makefile | gdb调试工具(2)
Linux开发工具大全 - 软件包管理器yum | vim编辑器 | gcc/g++编译器 | 自动化构建工具Make/Makefile | gdb调试工具(2)
429 0
|
NoSQL Linux 开发工具
【Linux】5. 开发工具的使用(gcc/gdb/makefile)
【Linux】5. 开发工具的使用(gcc/gdb/makefile)
325 2
|
NoSQL 编译器 Linux
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
【Linux】--- Linux编译器-gcc/g++、调试器-gdb、项目自动化构建工具-make/Makefile 使用
566 0