为什么“链接时间优化”会导致二进制文件更大?

老鼠

在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将无法工作!(使用makeCC=gcc -flto -Os不要CFLAGS= -flto -Os)。

你没忘了-Os链接时,在另外-flto; 只是-flto在链接时通过而没有进行任何优化是错误的:LTO阶段最多将“取消优化”

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

同样,LTO的要点是多个编译单元内联,这有望增加代码。因此,也许您不应该在特定情况下使用LTO。

即使没有LTO,大多数冗余功能也已被删除(通过节上的链接器“ GC”)。

顺便说一句,您可以使用objdumpreadelf查找。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在可执行二进制文件中插入字符会导致其“中断”?

gcc链接选项,查看为什么将某些目标文件链接为二进制文件

Golang-为什么在类似计算机上进行编译会导致二进制文件大小明显不同?

为什么unique_ptr实例化编译为比原始指针更大的二进制文件?

g ++为什么不必链接iostream二进制文件,但对于pthread呢?

为什么使用HsColour二进制文件的存在/不存在会强制重新编译QuickCheck库?

为什么git索引文件是二进制的?

cat为什么更改二进制文件的内容?

用dtype读取二进制文件会导致ValueError

为什么使用LTO会增加Rust二进制文件的大小?

动态链接尝试全部产生静态链接的二进制文件?为什么?

在python中按行读取二进制文件会导致unicode数据问题吗?

什么会导致.NET Core二进制文件加载本机库,然后引发DllNotFoundException?

为什么我必须使用ld链接我的二进制文件

为什么写此二进制文件会切断文件的结尾?

Perl模块取决于二进制文件,即使使用CheckBin,为什么在FreeBSD上测试也会失败?

为什么“二进制文件”不在原始二进制文件中?

是什么会导致Linux中的file命令将文本文件报告为二进制数据?

为什么函数定义的顺序会更改输出二进制文件?

为什么GCC不支持将动态库链接到静态二进制文件

为什么链接的二进制文件包含已使用的目标文件的文件名,如何将其删除?

为什么我会执行二进制文件错误?

为什么Ubuntu 12.04 64bit将符号链接识别为二进制文件?

符号链接会发生什么?原始二进制文件和符号二进制文件的行为不同

插入线程二进制引线会导致O(n)时间复杂吗?

为什么忽略二进制文件是最佳做法?

为什么 git 会阻止合并二进制文件?

为什么这个二进制输出代码会导致内存泄漏

为什么 Rust 应用程序二进制文件是“动态链接的”?