当我在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
答案 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"部分)。
顺便说一句,您可以使用objdump
或readelf
来查找。
答案 1 :(得分:0)
LTO的重要一点是工作链接器插件支持。只有使用GCC才能进行侵略性的无法访问代码删除和其他优化。确保你有启用插件的链接器(只要尝试LTO链接与-fuse-linker-plugin一起工作)