有一个名为.debug_info
的部分,它占用了最大的内存。
请注意,这个部分没有SHF_ALLOC
标志,因此在运行时不会占用任何RAM(它只会占用文件系统中的空间)。当然,如果您使用ramdisk,那么这个部分最终仍会花费您的RAM。
是的:所有.debug*
部分在运行时都不必要,所有这些部分都可以安全地剥离。
很可能你从你链接的库中得到了.debug_*
部分,而不是来自你自己的代码。当库被编译时,-g
已经存在,因此使用-g0
进行构建没有任何效果。
令人惊讶的是,-s
没有起作用,但也许你的编译器对这个标志的解释不同。
无论如何,你应该使用strip --strip-debug
来摆脱.debug_*
部分(注意:这不会删除符号表)。
最佳实践实际上是使用完整的调试信息(-g
)编译所有代码,保存完整的调试二进制文件以进行事后分析,使用strip --strip-debug
制作发布二进制文件,并使用该二进制文件进行实际分发。
如果/当发布二进制文件崩溃并留下核心转储时,拥有(保存的)完整调试完全匹配的二进制文件可以极大地改善您可以进行的事后分析。
-g0
吗?或在ld
中添加--gc-sections
参数?无论如何,通常可以通过-s
命令或strip
工具来完成。 - Dan M.strip
的手册页。它有各种选项,可以让您决定要剥离什么,包括仅剥离调试信息。 - David Schwartz