当我在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”)。

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

关于gcc - 为什么 'Link Time Optimization'导致二进制文件更大?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24718652/

10-10 22:38