杂项随记:gcc/objdump/section等
2024-09-16 10:12:49
gcc -g
如果不打开-g或者-ggdb(GDB专用)调试开关,GCC编译时不会加入调试信息,因为这会增大生成代码的体积。GCC采用了分级调试,通过在-g选项后附加数字1、2或3来指定在代码中加入调试信息量。
级别1(-g1)不包含局部变量和与行号有关的调试信息,只能用于回溯跟踪和堆栈转储之用。[ 回溯跟踪指的是监视程序在运行过程中的函数调用历史,堆栈转储则是一种以原始的十六进制格式保存程序执行环境的方法,两者都是经常用到的调试手段。
默认的级别是2(-g2),此时调试信息包括扩展的符号表、行号、局部或外部变量信息。
级别3(- g3)包含级别2中的调试信息和源代码中定义的宏。
gcc -E
显示预处理结果,包括宏展开,头文件展开等。不进行后续编译等其他阶段。配合-p,可以在预处理阶段不生成linemarks。
objdump -l
在dump 代码段时显示代码行
.bss 未初始化或初始化为0,系统启动时多自动清零
.data 初始化为非0
.rodata 常量,常量也可包含在.text等中
common段:全局变量来若未被初始化,则作为弱符号,先保存在common段,等于只是声明,到链接时再放入到BSS段。(不同编译器行为可能会不同,有的编译器会把没有初始化的全局变量直接放到BSS段)。一个变量多次被定义为强符号(初始化)则编译报错。在编译阶段,可以通过-fno-common选项来禁止将未初始化的全局变量放入到common段。
① 同名的强符号只能有一个,否则编译器报"重复定义"错误。
② 允许一个强符号和多个弱符号,但定义会选择强符号的。
③ 当有多个弱符号相同时,链接器选择占用内存空间最大的那个。
最新文章
- 算是休息了这么长时间吧!准备学习下python文本处理了,哪位大大有好书推荐的说下!
- Sql 随机更新一条数据返回更新数据的ID编号
- 转:在Eclipse中进行C/C++开发的配置方法(20140721最新版)
- 【HDOJ】3033 I love sneakers!
- javascript加载优化
- HTTP的REST服务简介
- Java学习之旅基础知识篇:数组及引用类型内存分配
- iOS开发 MVVM+RAC 的使用
- Python文件读写 - 文件r+ a+ open读写实际表现[示例]
- bat自动打包压缩实现
- 前端系列之JavaScript基础知识概述
- Git团队协作之GitFlow &; SoucceTree
- LeetCode编程训练 - 位运算(Bit Manipulation)
- uploadify上传图片的使用
- Word Embedding/RNN/LSTM
- Docker学习笔记之使用 Docker Hub 中的镜像
- Java 之 POI各Jar包作用
- string类型版本号比较
- (转)Inno Setup入门(十三)——Pascal脚本(2)
- vim最实用命令和快捷键
热门文章
- 解决php网页运行超时问题:Maximum execution time of 30 seconds exceeded
- XMLHttpRequest cannot load ''. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' ' is therefore not allowed access.
- lucene分词器中的Analyzer,TokenStream, Tokenizer, TokenFilter
- 【WPF学习笔记】[转]周银辉之WPF中的动画 &;&; 晓风影天之wpf动画——new PropertyPath属性链
- Mac Security工具使用总结find-identity
- EF Core 日志跟踪sql语句
- 自定义一个处理图片的HttpHandler
- 用Delphi实现网络视频编程
- 无法远程访问 MySql Server
- 为什么Java中的字符串是不可变的?