1.
程序发布时,总是会把调试信息从程序中移除,另存到一个文件中,一则是减少发布程序的大小,二则是保护信息。
一般命令都会通过如下命令:
-
objcopy --only-keep-debug demo demo.debuginfo
,读取demo中的调试信息保存到demo.debuginfo文件中。 -
objcopy --strip-debug demo
,从demo中移除一下调试信息。使用readelf -S
查看前后的section,可以发现缺少了以下section(PS:这些section只有在编译时加了-g
参数时才会有)。
> [27] .debug_aranges PROGBITS 0000000000000000 00001061
> 0000000000000030 0000000000000000 0 0 1
> [28] .debug_info PROGBITS 0000000000000000 00001091
> 00000000000000bb 0000000000000000 0 0 1
> [29] .debug_abbrev PROGBITS 0000000000000000 0000114c
> 0000000000000069 0000000000000000 0 0 1
> [30] .debug_line PROGBITS 0000000000000000 000011b5
> 0000000000000042 0000000000000000 0 0 1
> [31] .debug_str PROGBITS 0000000000000000 000011f7
-
objcopy --add-gnu-debuglink demo.debuginfo demo
,在demo中增加一个叫做.gnu_debuglink
的section,其中保存了保存调试信息文件的名字和CRC校验值。这条命令主要是为了当demo.debuginfo和demo不一致时,gdb直接不加载demo.debuginfo,避免定位出错。
如果出现崩溃等问题,只需要将调试信息文件放到程序或动态库所在目录,然后启动gdb就可以轻易找到问题所在的代码了。
2.
通常来说删除调试信息就够了,当然为了更彻底地减小程序大小和保护信息,可以使用objcopy --strip-all demo
,不止删除调试信息还删除符号表,此时用nm
命令是无法获取符号信息的,对比objcopy --strip-debug demo
后的程序,主要是多删了程序中的以下section。
> [28] .symtab SYMTAB 0000000000000000 00001170
> 00000000000005d0 0000000000000018 29 41 8
> [29] .strtab STRTAB 0000000000000000 00001740
> 0000000000000228 0000000000000000 0 0 1