【问题标题】:What is section ".debug_info" in an elf file?精灵文件中的“.debug_info”部分是什么?
【发布时间】:2019-01-14 09:54:41
【问题描述】:

我有一个elf文件,在使用elfparser分析mapfile和elf时,我看到了一个叫.Debug_info的部分,它占用了最大的内存。

我正在为 xtensa DSP 编译,使用 xt-xc++,我没有使用 -g 选项也给出了 -o2 优化级别。

是否可以在发布版本中删除它?

【问题讨论】:

  • 不知道那个编译器,但这有关系吗?通常有一种 objcopy post build 步骤来创建程序员特定的二进制文件,它应该丢弃这些部分。
  • 您是否尝试过使用-g0?还是将--gc-sections 参数添加到ld?反正一般都是通过-s命令或者strip工具来完成的。
  • @DanM.,-g0 和 -s 选项不起作用。
  • @thomachan 阅读 strip 的手册页。它具有各种选项,可让您决定要剥离的内容,包括仅剥离调试信息。

标签: c++ elf map-files


【解决方案1】:

名为.debug_info 的部分占用了最大的内存。

请注意,此部分没有SHF_ALLOC 标志,因此在运行时占用任何RAM(它只占用文件系统中的空间)。当然,如果您使用 ramdisk,那么该部分最终仍然会花费您的 RAM。

是否可以在发布版本中删除它?

是的:.debug* 部分在运行时都不是必需的,所有这些部分都可以安全地剥离。

-g0-s 选项不起作用。

您很可能从正在链接的库中获取.debug_* 部分,而不是从您自己的代码中获取。 -g 是在编译库时存在的,因此使用 -g0 构建没有任何效果。

令人惊讶的是,-s 不起作用,但也许您的编译器对这个标志的解释不同。

无论如何,您都应该使用strip --strip-debug 删除.debug_* 部分(注意:这不会删除符号表)。

最佳实践实际上是使用完整的调试信息 (-g) 编译所有代码,保存完整的调试二进制文件以进行事后分析,使用 strip --strip-debug 制作发布二进制文件,然后将该二进制文件用于实际分布。

如果/当发布二进制文件崩溃并留下核心转储时,拥有(保存的)完全调试完全匹配的二进制文件会极大地改进您可以进行的事后分析。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 2020-05-27
    • 1970-01-01
    相关资源
    最近更新 更多