我有一个 elf 文件,在使用 elfparser 分析 mapfile 和 elf 时,我看到了一个名为 .Debug_info 的部分,它占用了最大的内存。
我正在为 xtensa DSP 编译,使用 xt-xc++,我没有使用 -g 选项也给出了 -o2 优化级别。
是否可以为发布版本删除它?
称为 的部分
.debug_info
,它占用了最大的内存。
请注意,此部分没有SHF_ALLOC
标志,因此在运行时不占用任何 RAM(它只占用文件系统中的空间)。当然,如果您使用 ramdisk,那么该部分最终仍然会花费您的 RAM。
是否可以为发布版本删除它?
是的:.debug*
运行时不需要任何部分,并且可以安全地剥离所有部分。
-g0
并且-s
选项不起作用。
您很可能.debug_*
从您正在链接的库中获取部分,而不是从您自己的代码中获取部分。-g
编译库时存在,因此构建 with没有-g0
任何效果。
令人惊讶的是它-s
不起作用,但也许您的编译器对此标志的解释不同。
在任何情况下,您都应该使用strip --strip-debug
删除.debug_*
部分(注意:这不会删除符号表)。
最佳实践实际上是使用完整的调试信息 ( -g
) 编译所有代码,保存完整的调试二进制文件以进行事后分析,用于strip --strip-debug
制作发布二进制文件,并将该二进制文件用于实际分发。
如果/当发布二进制文件崩溃并留下核心转储时,拥有(保存的)完全调试完全匹配的二进制文件会极大地改进您可以进行的事后分析。