导言


在这里插入图片描述
链接时优化(LTO - Link Time Optimization)是一种高级编译优化技术,它在链接阶段进行跨模块的全局优化。

1. 跨模块优化
传统编译只能在单个源文件内进行优化
LTO可以跨越多个源文件边界进行优化
优化器可以看到整个程序的全貌,做出更好的优化决策
2. 内联优化
可以内联跨文件的函数调用
消除不必要的函数调用开销
特别对小函数和频繁调用的函数效果明显
3. 死代码消除
删除整个程序中未使用的函数和变量
即使这些代码分布在不同的源文件中
显著减少最终二进制文件大小
4. 常量传播
在整个程序范围内传播常量值
优化跨模块的常量使用
5. 循环优化
跨函数边界的循环优化
更好的向量化机会

LTO优势:

  • 代码大小减少: 10-30%
  • 性能提升: 5-15%
  • 更好的缓存利用率
  • 减少分支预测失误

LTO代价

  • 编译时间增加
  • 内存使用增加(更加多的RAM)
  • 调试困难(优化后的代码结构可能与源码差异很大,调试信息可能不准确)
  • 符号可见性问题(某些函数可能被优化掉或内联,需要明确标记需要保留的符)

一、解决编译失败


在这里插入图片描述
如上所示,勾选“链接时优化(-flto)”后编译代码会失败。看上去是缺少一些依赖。

1.1、syscalls.c

在这里插入图片描述
在这里插入图片描述
如上所示,修改这四个函数就可以了。

1.2、勾选“链接时优化(-flto)“的编译

在这里插入图片描述
代码大小:54264B = 52.9KB。

1.3、不勾选“链接时优化(-flto)”的编译

在这里插入图片描述
代码大小:59932B = 58.52KB。

代码大小的变化 = 59932B - 54264B = 5668B = 5.5KB

更多推荐