---
title: 特性介绍
description: "在传统编译流程中，gcc将单个源文件（称为一个编译单元）直接编译并优化，生成包含汇编代码的 .o 目标文件，再由链接器对这些 .o 文件进行符号解析与重定位，最终链接成可执行文件。在这个过程中，拥有跨文件函数调用信息的链接器由于操作的是汇编代码，难以进行编译优化，而可以执行编译优化的环节，却没有跨文件的全局信息。这样的编译框架，虽然提高了编译效率，每次重新编译只需要编译修改过的少量编译单元，但也丢失了许多跨文件的优化机会。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdevkithistory/hgcc/hist-hgcc/kunpenghgcc_06_0020.html
sourcePath: /source/zh/kunpengdevkithistory/hgcc/hist-hgcc/kunpenghgcc_06_0020.html
indexId: 4313e62cfc65302fb4afa071ca4626a21e9462c53eab874b50143484032035b271
---
# 特性介绍

#### 背景

在传统编译流程中，gcc将单个源文件（称为一个编译单元）直接编译并优化，生成包含汇编代码的 .o 目标文件，再由链接器对这些 .o 文件进行符号解析与重定位，最终链接成可执行文件。在这个过程中，拥有跨文件函数调用信息的链接器由于操作的是汇编代码，难以进行编译优化，而可以执行编译优化的环节，却没有跨文件的全局信息。这样的编译框架，虽然提高了编译效率，每次重新编译只需要编译修改过的少量编译单元，但也丢失了许多跨文件的优化机会。


#### LTO流程

LTO设计的初衷就是希望能够在链接时，拥有跨编译单元的调用信息的时候，进行编译优化，提供更多的优化机会。为了达到这个目的，LTO需要将编译优化所需的IR 信息保留到链接时。在链接时，链接器会调用LTO插件，执行全程序分析，生成更加有效的优化决策，再经由编译优化生成更高效的IR，进一步转成包含汇编代码的目标对象文件，最后由链接器完成常规的链接工作。


#### 分区与并行

由于需要处理全局的调用图，在执行LTO时往往需要更长的编译时间，有时LTO的编译时间会达到非LTO的数倍。为了使LTO能够并行，以加快编译速度，分区模式出现了。在分区模式下，全局调用图会根据模块之间的关联性被拆分成若干个分区，各分区之间独立并行优化，是一种在编译时间和优化效果之间的平衡。
