【问题标题】:Why does 'Link Time Optimization' results in larger binaries?为什么“链接时间优化”会导致更大的二进制文件?
【发布时间】:2014-09-03 07:32:13
【问题描述】:

当我在 GCC 中启用链接时间优化时,生成的二进制文件变得更大。我希望 GCC 能够删除大量冗余函数,并执行其他不可能的优化,那么这怎么会导致生成的输出增长呢?

编译器标志:

-Os -c -fno-builtin -ffunction-sections -fdata-sections -flto -mcpu=cortex-m0 -mthumb 

链接器标志:

-nostdlib -s -Xlinker --gc-sections -flto -mcpu=cortex-m0 -mthumb -T

【问题讨论】:

  • 您使用-flto的具体情况如何?显示编译命令....并为我们提供了更多详细信息(编译器版本)。您是否尝试过使用最近的 GCC(即 2014 年 9 月的 4.9.1)?
  • 如果您使用 -O3(使代码更快但更大),LTO 为编译器提供了更多使代码更快(更大)的机会。如果您使用 -Os(制作小型二进制文件),LTO 为您提供了更多缩小代码大小的机会。
  • @MarcGlisse 谢谢,但我已经使用了 -Os 选项,否则固件根本不适合 64kb。
  • @Muis 首先,这些标志(以及 gcc 版本,最近发生了很大变化)应该包含在您的原始帖子中。其次,不,从您发布的内容(截断的命令行,所以我不得不猜测一下)您没有使用 -Os(不是真正重要的地方)。
  • @MichielUitHetBroek 原来这是我的 IDE (LPCXpresso) 中的一个错误,该标志也适用于我。

标签: gcc linker arm compiler-optimization


【解决方案1】:

在与-flto 链接后,您是否剥离了二进制文件(它应该在编译和链接时提供)?

顺便说一句,注意that 相同的优化标志(-flto -Os)应该在编译时两个传递在链接时。如果您在链接阶段忘记了它们中的任何一个,LTO 将无法工作! (当使用make 时,你需要CC=gcc -flto -Os 而不是CFLAGS= -flto -Os)。

你确实忘记了-Os link 时间,在 addition of -flto;只是在链接时传递-flto 而没有任何优化是错误的:LTO 阶段最多会“去优化”

我知道-flto 在 ELF 目标文件和可执行文件中添加了很多部分(这些部分包含 GCC 内部表示的序列化,如 Gimple....)。我猜(但尚未检查)链接不会删除它们。

此外,LTO 的主要目的是内联几个编译单元,这有望增加代码。所以也许你不应该在你的特殊情况下使用 LTO。

即使没有 LTO,大多数冗余功能也已被删除(通过节上的链接器“GC”)。

顺便说一句,您可以使用objdumpreadelf找出答案。

【讨论】:

  • 是的,我习惯了链接器的'-s'选项(省略所有调试信息)。我的固件通常适合 64 kb,但使用“-ftlo”它的大小几乎翻了一番。
  • LTO 是 GCC 的一个新特性。 gold(新链接器)版本和 gcc 版本都会影响代码生成。您应该为链接器提供与编译时相同的优化选项。这是一些人不知道的 LTO 的变化。 -O3 不是为了优化大小而是为了性能。如果你真的想要大小,你应该尝试-Os 编译和链接。
  • @Muis 您应该尝试使用strip 命令显式剥离二进制文件。
  • @artlessnoise 我已经使用 -Os 进行编译,但是如何将该设置指定给链接器?
  • @Masta79 链接器中止,并显示二进制文件不适合闪存区域 (64kb) 的消息,因此没有要剥离的输出二进制文件。我想我可以扩大该区域以假装我有更多闪存,但我不确定如果我将这样的二进制文件闪存到设备会发生什么。
【解决方案2】:

对 LTO 来说重要的是工作链接器插件支持。只有使用该 GCC 才能进行激进的无法访问的代码删除和其他优化。确保您有启用插件的链接器(如果 LTO 链接与 -fuse-linker-plugin 一起使用,请尝试)

【讨论】:

  • 是的,我已经解决了这个问题。这是我的 IDE (LPXPresso) 中的一个错误,其中设置仅适用于编译器,而不适用于链接器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
  • 2015-03-29
  • 2022-01-02
相关资源
最近更新 更多