全场景链接时二进制库内联优化

本特性支持全场景链接时的二进制内联,通过多版本二进制的组合输出,及LTO插件形式的多版本符号解析,支持不同版本编译器的LTO的内联优化;并设计跨模块的编译选项分析和匹配,适配不同编译模块的融合,实现全场景的链接时优化。

选项 -fmulti-version-lib=

说明

该选项为链接时选项,与-flto结合使用,用于LTO链接时指示传入的库为多版本的LTO格式,需要编译器切换旧版本的LTO形式读取 (目前支持openEuler 2403 SP1、openEuler 2409 编译的LTO格式),用于兼容不同LTO的静态库或目标文件进行融合链接及优化编译。

使用方式

在选项中加入,如传入多个文件名通过逗号隔开:

bash
-flto  -fmulti-version-lib=liba.a,libb.a

举例:

bash
# gcc for openEuler 24.09
gcc -O2 -fPIC -flto -c fa.c -o fa.o
gcc-ar rcs liba.a fa.o

# gcc for openEuler latest
gcc -O2 -fPIC -flto -fmulti-version-lib=liba.a main.c liba.a -o exe

选项 -finline-force=

说明

该选项为链接时选项,与-flto结合使用,用于在LTO链接时,指示对传入的目标静态库或目标文件尝试进行内联,该选项将对目标文件中的函数尝试内联增强,增强以下内联扩展:

  • 架构选项的兼容,当调用函数和被调用函数使用的march/mcpu等信息不同时,尽可能将被调用函数的架构选项与调用函数的架构选项切换一致,并进行内联编译。
  • inline关键字,类似于被调用函数增加了inline关键字,指示在编译过程中能找到函数实体,就尽可能内联。
  • always_inline属性,类似于被调用函数增加了__attribute__((always_inline))属性。

使用方法

在选项中加入,如传入多个文件名通过逗号隔开:

bash
-flto -finline-force=liba.a,libb.a

注:-finline-force,不加目标文件名形式,仅用于全局内联调试分析,不直接使用。

举例:

bash
gcc -O2 -fPIC -flto -c fa.c -o fa.o
gcc-ar rcs liba.a fa.o
gcc -O2 -fPIC -flto -finline -force=liba.a main.c liba.a -o exe