我刚刚偶然发现了同样的问题。以前我只是将我构建的 ELF 二进制文件与 objcopy 的--only-keep-debug
, --strip-debug
,--add-gnu-debuglink
标志分开。现在我需要节省更多空间,所以我正在考虑使用--strip-unneeded
而不是--strip-debug
. 但是和你一样,我担心这可能会影响我的调试体验。
因此,我进行了多次测试并得出以下结论:
--strip-unneeded
剥去被剥去的东西--strip-debug
,甚至更多。即“调试”信息被视为“不需要”信息的一部分。
- 使用该标志创建的调试二进制文件
--only-keep-debug
不仅存储由 .--strip-debug
剥离的信息,还存储由--strip-unneeded
.
- 如果使用
--strip-debug
. _ --strip-unneeded
_ --only-keep-debug
_
详情如下:
我创建了一个非常简单的 C++ 项目,其中包含一个可执行文件和一个共享库。该库包含一个全局导出的函数,由应用程序调用。该库还包含几个局部函数(即静态或在匿名命名空间中),由全局导出函数调用。本地函数中的代码只是通过抛出未处理的异常而导致崩溃。
首先,我用-g -O0
标志编译了两个二进制文件。其次,我在单独的二进制文件中从它们中提取了调试信息,并将这些调试文件链接到原始二进制文件。即,对于两个文件:
objcopy --only-keep-debug $FILE $FILE.debug
objcopy --add-gnu-debuglink=$FILE.debug $FILE
在此之后,我有未剥离的二进制文件也有单独的对应链接调试二进制文件。
然后我将这些文件复制到另外两个目录中。在第一个中,我--strip-debug
对原始二进制文件进行了处理,在另一个中,我完成了--strip-unneeded
.
考虑文件大小,原始文件明显最大,strip-unneeded 目录中的文件最小,而 strip-debug 目录中的文件位于中间。此外,另外--strip-debug
对 strip-unneeded 目录中的文件运行并没有改变文件大小,这意味着--strip-debug
只去除被--strip-unneeded
.
然后,我通过运行readelf -S
所有三个变体来比较所有三个变体的部分列表。查看它们,可以看出--strip-debug
剥离了以下部分:.debug_arranges
、.debug_info
、.debug_abbrev
、.debug_line
和.debug_str
,并且还稍微减少了.symtab
和.strtab
部分。
--strip-unneeded
另外还完全删除.symtab
和.strtab
部分。
然后我运行readelf -S
了带有--only-keep-debug
标志的调试二进制文件。那里的部分已删除所有部分--strip-unneeded
。因此,它不仅包含.debug_arranges
, .debug_info
, .debug_abbrev
, .debug_line
and .debug_str
, 而且还包含.symtab
and .strtab
。并且这些部分的尺寸几乎与它们的原始尺寸相同。
然后我尝试逐步调试所有三个变体,并没有注意到它们之间有任何区别。此外,我已经产生了所有这些崩溃和核心转储,然后尝试针对核心转储进行调试 - 也没有区别。
使用的版本: gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609 GNU objcopy (GNU Binutils for Ubuntu) 2.26.1 GNU strip (GNU Binutils for Ubuntu) 2.26.1