为什么'链接时间优化'导致更大的二进制文件?

时间:2014-07-13 01:00:12

标签: gcc linker arm compiler-optimization

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

编译器标志:

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

链接器标志:

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

2 个答案:

答案 0 :(得分:15)

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

顺便说一句,请注意that 相同的优化标记(-flto -Os)应该在编译时传递两个并且在链接时。如果你忘了 - 就像你在连接阶段所做的那样 - LTO不会工作! (使用make时需要CC=gcc -flto -Os而不是CFLAGS= -flto -Os)。

您在链接的时间忘记了-Os-flto添加;只是在链接时通过-flto而没有任何优化是错误的:LTO阶段将"去优化"最多

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

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

即使没有LTO,大多数冗余功能也已被删除(链接器" GC"部分)。

顺便说一句,您可以使用objdumpreadelf来查找。

答案 1 :(得分:0)

LTO的重要一点是工作链接器插件支持。只有使用GCC才能进行侵略性的无法访问代码删除和其他优化。确保你有启用插件的链接器(只要尝试LTO链接与-fuse-linker-plugin一起工作)