【问题标题】:gcc -g vs not -g and strip vs not strip, performance and memory usage?gcc -g vs not -g和strip vs not strip,性能和内存使用情况?
【发布时间】:2011-08-21 15:02:11
【问题描述】:

如果二进制文件大小不是问题,使用 -g 而不是剥离要在性能关键环境中运行的二进制文件有什么缺点吗?我有很多磁盘空间,但二进制文件是 cpu 密集型的并且使用大量内存。二进制文件只加载一次,可以存活几个小时。

编辑:

我想使用带有调试信息的二进制文件的原因是在出现分段错误时生成有用的核心转储。

【问题讨论】:

  • 我认为问题归结为符号是否默认加载到内存中。如果是,这将有助于加载时间和内存消耗。有趣的问题,期待答案。 +1
  • @unapersson:很难在我们的环境中进行这样的测试,因为性能在很大程度上取决于快速变化的外部因素。

标签: c optimization gcc strip


【解决方案1】:

ELF 加载器加载 segments,而不是 sections;从节到段的映射由用于构建可执行文件的链接描述文件确定。

默认链接描述文件不会将调试部分映射到任何段,因此省略。

符号信息有两种形式:静态符号在带外处理,从不存储为节数据;动态符号表由链接器生成并添加到与可执行文件一起加载的特殊段中,因为动态链接器需要可以访问它。 strip 命令只删除静态符号,无论如何都不会在段中引用。

因此,您可以在整个过程中使用完整的调试信息,这不会影响 RAM 中可执行映像的大小,因为它没有加载。这也意味着该信息不包含在核心转储中,因此这也不会给您带来任何好处。

objcopy 实用程序具有仅复制调试信息的特殊选项,因此您可以生成包含此信息的第二个 ELF 文件并使用剥离的二进制文件;在分析核心转储时,您可以将这两个文件加载到调试器中:

objcopy --only-keep-debug myprogram myprogram.debug
strip myprogram

【讨论】:

  • 感谢您提供的完整解释!为了验证我的理解是否正确......使用 -g 构建的二进制文件的执行速度将与剥离的二进制文件一样快(从相同的源代码构建),并且它们都会在出现分段错误的情况下生成相同的核心转储?
  • 没错。此外,剥离二进制文件会删除 -g 生成/保留的信息,以及更多信息,因此无论您是否使用 -g 编译,剥离后的结果都应该相同。
猜你喜欢
  • 2020-01-01
  • 1970-01-01
  • 2012-12-18
  • 2022-07-02
  • 2022-01-20
  • 2020-06-23
  • 2021-11-21
  • 1970-01-01
  • 2015-10-26
相关资源
最近更新 更多