Linux(gcc编译原理、过程以及常用调试命令)
PS:红色字体表示重点,绿色字体表示重要标题,块引用中表示Linux终端中的命令。
1.gcc / g++的安装
命令:sudo apt install gcc /gcc+
2.gcc编译连接
//main.c文件
(1)预编译
①删除所有的“#define”,并且展开所有的宏定义;
②处理所有的条件预编译指令,“#if”,“#ifdef”,“#endif”等;
③处理“#include"预编译指令,将被包含的文件插入到该预编译指令的位置;
④删除所有的注释;
⑤添加行号和文件名标识,以便于编译器产生调试用的符号信息及编译时产生编译错误和警告时显示行号;
⑥保留所有的#program编译器指令,因为编译器需要使用它们。
gcc -E main.c -o main.i
(2)编译
①词法分析
②语法分析
③语意分析
④代码优化
⑤汇总符号
gcc -S main.i -o main.s
(3)汇编
将汇编指令翻译成二进制格式,生成各个section,生成符号表。
gcc - c main.s -o main.o
(4)链接
①合并各个section,调整section的起始位置和段大小,合并符号表,进行符号解析,给符号分配虚拟地址;
②符号重定位,即在使用符号的地方全部替换成符号的虚拟地址;
gcc main.o -o main
3.编译链接过程
编译连接原理:
(1)main.c通过预编译生成main.i文件;
(2)main.i通过编译生成main.s文件;
(3)main.s通过汇编生成main.o文件;
链接就是将所有的:
.o文件 、.a文件(静态库文件) 、.lib文件、.obj文件链接起来
生成.out文件(ELF格式的可执行文件)
Windows是生成.exe文件
四个阶段如下图所示:
4.执行
如何启动一个进程?
①路径+可执行文件名
②路径+可执行文件名 &
(1)关于一步执行(重点)
四步合为一步:
gcc -o main main.c
(2)关于两步执行
三步合为一步:
gcc -c main.c -o main.o 或者 gcc -c main.c
gcc -o main main.o
gcc可以编译C++文件
gcc -o main.c++ mainc++.cpp -lstdc++(指明用C++的标准库)
(下划线部分是文件的名字)
5.gdb调试
(1)debug版本
(程序员)
在编译阶段会加入某些调试信息
调试信息是在编译的过程中加入到中间文件.o文件的;
(2)release版本
(用户)(发行版本,体积小,没有调试信息)
gcc 默认生成的是release版本。
(3)安装debug(dbg)
命令:sudo apt install dbg
(4)加入调试信息
gcc -o test test.c -g(在编译阶段加的调试信息,非链接阶段)
(5)常用调试命令(重点)
①进入调试:gdb test
②加断点:b+行号
③启动程序:r
④显示代码:l
⑤显示断点信息:info break/info b
⑥删除断点信息:delete 断电编号
⑦单步执行:n
⑧打印:p
⑨自动打印:display
⑩退出:q
⑪进入函数:s
⑫跳入函数:finish
⑬加断点导函数入口处:b+函数名
⑭取消一个display undisplay display的编号
⑮c:继续(continue)
(6)补充命令
①l:显示main函数所在的文件的源代码;
list 文件名:num 显示文件名文件num行上下的源代码;
②b 行号:给指定行添加断点;
b 函数名:给指定函数的第一有效行添加一个断点;
③info break:显示断点信息; delete 断点号:删除指定断点;
④r(run):运行程序;
⑤n(next):单步执行;
⑥c(continue):继续执行,直接执行到下一个断点处;
⑦s:进入将要被调用的函数中执行;
⑧finish:跳出函数;
⑨q:退出调试;
⑩bt:显示函数调用栈;
⑪disable 断点号:将断点设定为无效的,不加断点号,将所有断点设置为无效;
enable 断点号:将断点设定为有效的,不加断点号,将所有断点设置为有效;
⑫p val:打印变量val的值 p &val:打印变量val的地址 p a+b:打印表达式的值;
⑬p arr(数组名):打印数组所有元素的值;
⑭*parr@len:用指向数组的指针打印数组所有元素的值;
⑮display:自动显示,参数和p命令一样;
⑯info display:显示自动显示信息 undisplay+编号:删除指定的自动显示;
⑰ptype val:显示变量类型。
如有错误,敬请指正!
您的点赞与收藏是对我最大的鼓励与支持。
Linux(gcc编译原理、过程以及常用调试命令)相关推荐
- Linux gcc编译过程及动态/静态库制作
Linux库概念及如何制作静态库和动态库 1: gcc编译的过程 2: 分文件编程 3: 库(静态库和动态库) 3.1: 库的基本介绍 3.2: 静态和动态库的区别 3.3: 库的制作及使用 3.3. ...
- Linux程序编译的过程
Linux程序编译的过程 编译过程 分析ELF文件 Linux 基本命令 编译过程 c,c++代表的高层语言编写的程序在转化成为处理器可以识别并且执行的二级制代码的过程 预处理Preprocessin ...
- 编译linux内核生成.ko,Linux内核编译完整过程
通过网上的资料我自己的实际内核编译,我把对Linux内核编译的过程写在这里,也许对其他的Linux爱好者的编译学习有些帮助,其中很大部分是网上的资料,另外就是我在实际编译过程中的一些实际经验. 内核简 ...
- vxworks常用调试命令
总结的vxworks常用调试命令,学习vxworks这些东西是必须的. 1.与任务相关的命令 sp, [arg1], ..., [arg9] -启动任务,最多接受9个参数,默认的优先级100 ...
- Bochs常用调试命令
Bochs常用调试命令 Bochs是非常好用的模拟器,命令也很多,不过最常用的其实总结起来也就包括几条,记住这些命令基本都可以满足调试需求了. 1. 断点操作 (1)设置断点:b 物理地址 例:b 0 ...
- Rockchip Android平台常用调试命令汇总
Rockchip Android平台常用调试命令汇总 文章目录 Rockchip Android平台常用调试命令汇总 查看帧率信息 查看显示图层信息 手动触发内核产生panic 通过命令设置Andro ...
- Linux gcc编译c/c++基本过程
Linux系统下开发c++程序,那么gcc编译器就是我们绕不过去的一道坎.gcc是GNU出品的一款可以在多种硬件平台上编译处可执行程序的超级编译器,其执行效率比普通的编译器要高出20%~30%左右,而 ...
- Linux+gcc设置断点,gcc/g++常用编译选项和gdb常用调试命令
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? gcc/g++编译器是我们写编译C/C++程序时离不开的编译工具,而gdb又是调试C/C++程序的利器,这一篇文章我们记 ...
- Linux GCC 编译过程分析及常用检错的编译选项
文章目录 简介 一.拆解编译过程 1.准备源程序 2.分析拆解过程 3. 多个程序文件的编译 4.检错的编译选项 1.-pedantic 编译选项 2.-Wall 编译选项 3.-Werror 编译选 ...
最新文章
- Android SQLiteDatabase的使用
- SpringBoot:AOP处理请求
- (数据结构与算法)递归及一些经典递归问题
- rtems 4.11 RTC驱动 (arm, beagle)
- CSS中的选择器之类选择器和id选择器
- ubuntu下面调整Atom的python运行结果中的字体大小
- linux存储格式化和挂载
- 1.1 WEB API 在帮助文档页面进行测试
- 微信小程序CSS之Flex布局
- aria2,破解限速的傻瓜式教程
- JAVA代码实现下载解析网易云音乐到本地电脑的demo示例
- TCPUDP测试工具的使用
- 设计模式——行为型模式
- 计算机无法启动print,Win7无法启动print spooler服务报错1068怎么办
- Idea编译:Java找不到符号
- 如计算机网络如何建立内部网,如何建立局域网【图文教程】
- CSS3鼠标悬停360度旋转效果
- 基于图像的三维重建——针孔相机模型(1)
- 新点互联互通_新点驱动(江苏省互联互通版)
- gitlab忘记密码进行重置