Osheep

时光不回头,当下最重要。

程序瘦身

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
点赞