杂项随记:gcc/objdump/section等

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