为什么调试的时候需要编译选项中添加 -g。readelf命令.

 -g     以 操作系统的本地格式 (stabs, COFF, XCOFF, 或 DWARF).  产生调试信息. GDB能够使用这些调试信息.

       在大多数使用 stabs 格式的系统 上, `-g' 选项启动只有 GDB 才使用的额外调试信息; 这些信息使GDB调试效果更好,但是有可能导致其他调试器崩溃, 或拒绝读入程序.  如果你确定要控制是否生成额外的信息, 使用`-gstabs+', `-gstabs', `-gx‐','coff+', `-gxcoff', `-gdwarf+', 或 `-gdwarf' .

       和大多数 C 编译器不同, GNU CC 允许结合使用 `-g' 和 `-O' 选项. 优化的代码偶尔制造 一些惊异的结果:  某些声明过的变量根本不存在;  控制流程直接跑到没有预料到的地方; 某些语句因为计算结果是常量或已经确定而没有 执行; 某些语句在其他地方执行, 因为他们被移到循环外面了.

       然而它证明了调试优化的输出是可能的. 对可能含有错误的程序使用优化器是合理的.

可以通过查询手册了解更多关于 gcc -g 的选项,输入命令(man gcc)

readelf    一般用于查看 ELF 格式的文件信息。

语法:readelf (选项)(参数:文件),除了-v和-H之外,其它的选项必须有一个被指定参数。

-a 相当于指定-文件头、-程序头、-节、-符号、-重定位、-动态、-注释和-版本信息。

1)选项 -h(elf header),显示elf文件开始的文件头信息;

2)选项 -l(program headers),segments 显示程序头(段头)信息;

3)选项 -S(section headers),sections 显示节头信息;

4)选项 -g(section groups),显示节组信息;

5)选项 -t,section-details 显示节的详细信息(-S的);

6)选项 -s,symbols 显示符号表段中的项;

7)选项 -e,headers 显示全部头信息,等价于: -h -l -S;

8)选项 -n,notes 显示note段(内核注释)的信息;

9)选项 -r,relocs 显示可重定位段的信息;

10)选项 -u,unwind 显示unwind段信息。当前只支持IA64 ELF的unwind段信息;

11)选项 -d,dynamic 显示动态段的信息;

12)选项 -V,version-info 显示版本段的信息;

13)选项 -A,arch-specific 显示CPU构架信息;

14)选项 -I,histogram 显示符号的时候,显示bucket list长度的柱状图;

15)选项 -x,hex-dump=

16)选项 -D,use-dynamic 使用动态段中的符号表显示符号,而不是使用符号段 ;

17)选项 -a,all 显示全部信息,等价于 -h -l -S -s -r -d -V -A -I;

18)选项 -v,version 显示readelf的版本信息;

19)选项 -H,help 显示readelf所支持的命令行选项。

参考:http://www.eeworld.com.cn/mcu/2019/ic-news040143674.html

猜你喜欢

转载自blog.csdn.net/qq_43210641/article/details/90270585
今日推荐