杂项随记:gcc/objdump/section等

本文介绍了GCC编译器的调试信息开关使用方法,包括-g1、-g2和-g3的不同作用,以及如何使用gcc-E查看预处理结果。此外还详细解释了.bss、.data和.rodata等不同段的作用及它们在程序中的分配情况。

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段。

① 同名的强符号只能有一个,否则编译器报"重复定义"错误。

② 允许一个强符号和多个弱符号,但定义会选择强符号的。

③ 当有多个弱符号相同时,链接器选择占用内存空间最大的那个。

转载于:https://www.cnblogs.com/justinh/p/7381126.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值