The LLVM gold plugin¶
Building with link time optimization requires cooperation from the system linker. LTO support on Linux systems requires that you use the gold linker which supports LTO via plugins. This is the same mechanism used by the GCC LTO project.
The LLVM gold plugin implements the gold plugin interface on top of
libLTO. The same plugin can also be used by other tools such as
How to build it¶
You need to have gold with plugin support and build the LLVMgold plugin.
Check whether you have gold running
/usr/bin/ld -v. It will report “GNU
gold” or else “GNU ld” if not. If you have gold, check for plugin support
/usr/bin/ld -plugin. If it complains “missing argument” then
you have plugin support. If not, such as an “unknown option” error then you
will either need to build gold or install a version with plugin support.
Download, configure and build gold with plugin support:
$ git clone --depth 1 git://sourceware.org/git/binutils-gdb.git binutils $ mkdir build $ cd build $ ../binutils/configure --enable-gold --enable-plugins --disable-werror $ make all-gold
That should leave you with
build/gold/ld-newwhich supports the
makewill additionally build
nm-newbinaries supporting plugins.
Build the LLVMgold plugin. Run CMake with
-DLLVM_BINUTILS_INCDIR=/path/to/binutils/include. The correct include path will contain the file
The linker takes a
-plugin option that points to the path of
.so file. To find out what link command
would run in a given situation, run
gcc -v [...] and
look for the line where it runs
collect2. Replace that with
ld-new -plugin /path/to/LLVMgold.so to test it out. Once you’re
ready to switch to using gold, backup your existing
then replace it with
You should produce bitcode files from
clang with the option
-flto. This flag will also cause
clang to look for the gold plugin in
lib directory under its prefix and pass the
-plugin option to
ld. It will not look for an alternate linker, which is why you need
gold to be the installed system linker in your path.
nm also accept the
-plugin option and it’s possible to
/usr/lib/bfd-plugins for a seamless setup.
If you built your own gold, be sure to install the
Quickstart for using LTO with autotooled projects¶
Once your system
nm all support LLVM bitcode,
everything is in place for an easy to use LTO build of autotooled projects:
Follow the instructions on how to build LLVMgold.so.
Install the newly built binutils to
Set environment variables (
$PREFIXis where you installed clang and binutils):
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
Or you can just set your path:
export PATH="$PREFIX/bin:$PATH" export CC="clang -flto" export CXX="clang++ -flto" export RANLIB=/bin/true
Configure and build the project as usual:
% ./configure && make && make check
The environment variable settings may work for non-autotooled projects too,
but you may need to set the
LD environment variable as well.
Gold is licensed under the GPLv3. LLVMgold uses the interface file
plugin-api.h from gold which means that the resulting
binary is also GPLv3. This can still be used to link non-GPLv3 programs
just as much as gold could without the plugin.