【问题标题】:gcc -O2 is smaller then gcc -O2 -g followed by strip --strip-allgcc -O2 比 gcc -O2 -g 小,然后是 strip --strip-all
【发布时间】:2020-01-01 12:50:56
【问题描述】:

我正在构建要生成发布版本的代码。不过,我也希望能够在 cores 崩溃时对其进行调试。

所以我读到可以使用带有调试符号的构建,然后生成运行 strip 的二进制文件的副本。然后,您可以获取剥离的二进制文件(已发布/客户二进制文件)生成的核心,然后将其与带有调试符号的二进制文件副本 gdb...

所以对我来说第一步是生成二进制文件,我这样做了:

  • gcc -O2 ... -o testbin_release_orig(原始释放箱无符号)
  • gcc -O2 -g ... -o testbin_debug(完整的调试二进制文件)
  • cp testbin_debug testbin_release
  • strip --strip-all testbin_release(剥离的调试二进制文件)

这会产生三个不同大小的文件:

  • testbin_release_orig: ~1.7Mb
  • testbin_debug: ~13Mb
  • testbin_release: ~2.1Mb

我的问题是,为什么testbin_releasetestbin_release_orig 的大小不完全相同?我猜 strip 不能去掉 gcc 添加的所有调试符号。但是有大约 0.4Mb 的“额外的东西”——它是由什么组成的?

【问题讨论】:

  • 您可以尝试使用objdump --all-headers 查看基本部分信息——名称、大小等。
  • @G.M.所以...在符号表之前它们基本上是相同的,其中剥离版本没有符号表,而发布版本确实......这是有道理的,因为我使用了全部剥离。但这并没有说明为什么剥离后的版本更大(事实上,它本身表明发布版本更大,因为它具有完整的符号表)。我可能会尝试对整个 objdump 进行比较,但我希望这会很混乱:o
  • 我为调试符号做了一个objdumg -g - 发布和剥离的输出文件大小(objdump)的差异是~0.4Mb ...所以这告诉我调试符号有0.4Mb哪里没有被剥夺......但是......为什么?
  • 尝试运行strip -S -v testbin_release 以查看正在修改的条带,并将strip -v testbin_release_orig 的输出与strip -v testbin_release 进行比较,以查看可能存在哪些符号。我相信,主要的事情是调试符号可能会被剥离,但这并不意味着调试二进制文件不包含没有被剥离的额外指令(例如assert's 或其他)。
  • @EliasVanOotegem hmm.. strip -v ... 命令只为两者生成一行输出:copy from 'testbin_release' [elf32-i386] to 'stBQgfVX' [elf32-i386],除了哈希数,输出是相同的......这就是你的意思?

标签: c++ linux gcc strip


【解决方案1】:

区别在于调试代码。

对于 1.7 MB 的可执行文件,您可能正在使用一两个库。通常他们有类似的东西:

#ifdef _DEBUG
    // some debug code
#endif

也是大型项目的常见做法,因此其中一些可能也是您的代码。

strip 仅删除符号。调试代码保留。

【讨论】:

  • 啊,我明白了 - 这很有意义:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 2021-07-27
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多