在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
(应在编译时和链接时同时提供)?
顺便说一句,注意的是 在相同的优化标志(-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
查找。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句