为什么"链接时间优化"会产生更大的二进制文件?

Mui*_*uis 10 linker gcc arm compiler-optimization

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

编译器标志:

-Os -c -fno-builtin -ffunction-sections -fdata-sections -flto -mcpu=cortex-m0 -mthumb 
Run Code Online (Sandbox Code Playgroud)

链接器标志:

-nostdlib -s -Xlinker --gc-sections -flto -mcpu=cortex-m0 -mthumb -T
Run Code Online (Sandbox Code Playgroud)

Bas*_*tch 16

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

顺便说一句,注意的是 相同的优化标志(-flto -Os)应当通过双方在编译时链接时.如果你忘了 - 就像你在连接阶段做了任何一个,LTO将无法工作!(当使用make你想CC=gcc -flto -OsCFLAGS= -flto -Os).

你没忘了-Os链接时,在另外-flto; 只是-flto在没有任何优化的情况下在链接时间传递是错误的:LTO阶段最多会"去优化"

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

另外,LTO的要点是内联翻过几个编译单元,这有望增长的代码.所以也许你不应该在你的特定情况下使用LTO.

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

顺便说一句,你可以使用objdumpreadelf找出答案.

  • *LTO*是GCC的新功能.*gold*(新链接器)版本和*gcc*版本都会影响代码生成.您应该**为链接器提供与编译时相同的优化选项.这是*LTO*的变化,有些人不知道.`-O3`不是为了优化尺寸而是为了性能.如果你真的想要大小,你应该尝试`-Os`进行编译和链接. (2认同)