当我在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
链接之后,您是否剥离了二进制文件(应在编译时和链接时同时提供该二进制文件)?
顺便说一句,注意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
找出答案。
关于gcc - 为什么 'Link Time Optimization'导致二进制文件更大?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24718652/