llvm+clang 添加 LTO(Link Time Optimization) 支持

llvm+clang 添加 LTO(Link Time Optimization) 支持

binutils

LTO 要求當前系統binutils可使用 gold linker或者ld.bfd 通過 plugin 支持 LTO, binutils 版本 >= 2.21.511.0.2. 可通過ld -plugin 檢查當前系統是否支持 plugin.
RHEL/CentOS6 系統自帶 binutils 不支持 plugin.

$ ld -v
GNU ld version 2.20.51.0.2-5.47.el6_9.1 20100205
$ ld -plugin
ld: unrecognized option '-plugin'
ld: use the --help option for usage information

安裝 devtoolset-7 後可以支持.

$ ld -v
GNU ld version 2.28-8.el6
$ ld -plugin
ld: -plugin: missing argument
ld: use the --help option for usage information

亦可通過重新編譯binutils安裝到系統提供支持

$ git clone --depth 1 git://sourceware.org/git/binutils-gdb.git binutils
$ mkdir build
$ cd build
$ ../binutils/configure --disable-werror # ld.bfd includes plugin support by default
$ make all-ld

LLVM-CLANG

Full compile llvm-clang

重新配置 llvm-clang 運行 cmake 添加 -DLLVM_BINUTILS_INCDIR=/path/to/binutils/include 指定包含 plugin-api.h 目錄參數 , make install/strip 即可.

LLVMgold plugin

安裝 binutils$PREFIX 目錄.

cmake ... -DLLVM_BINUTILS_INCDIR=/path/to/binutils/include ../llvm_Release_500/
make -C tools/gold/

複製 /lib/LLVMgold.so$PREFIX/lib/bfd-plugins/

Usage

clang -flto xxx.c -o xxx

autotool 工具鏈配置使用.

export CC="$PREFIX/bin/clang -flto"
export CXX="$PREFIX/bin/clang++ -flto"
export AR="$PREFIX/bin/ar"
export NM="$PREFIX/bin/nm"
export RANLIB=/bin/true #ranlib is not needed, and doesn't support .bc files in .a

參考

gold linker
GCC LTO
libLTO
GoldPlugin

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章