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

  • Post author:
  • Post category:linux



目录


一、什么是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)



列出源代码


break





b)



设置断点


info break



查看断点信息




info functions


run(r)



运行


continue(c)



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


step(s)



单步跟踪,类似于




VC




中的




step into


next





n)



单步跟踪,类似于




VC




中的




step over


finish



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


util(u)



退出循环


print





p)



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


watch



设置观察点

示例:



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

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

感谢观看!!!!

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



版权声明:本文为logani原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。