3

我一直在尝试启用 FreeBSD 上的黄金链接器以使用链接时间优化。我从 /usr/ports 下的 binutils 中获得了金子。在使用 make -k install clean 构建 binutils 后,我在 /usr/bin 下得到了 ld,在目录 /usr/local/bin 中得到了 ld、ld.gold 和 ld.bfd。

现在,在尝试对此处的简单示例程序使用链接时间优化http://llvm.org/docs/GoldPlugin.html(标题为“链接时间优化示例”下的 ac 和 bc)时,我输入了如下四个命令:

clang -flto a.c -c -o a.o 
ar q a.a a.o 
clang b.c -c -o b.o 
clang -flto a.a b.o -o main

我收到以下错误:

usr/bin/ld: unrecogonized option '-plugin'
usr/bin/ld: use the --help option for usage information
clang: error: linker command failed with exit code 1 (use -v to see invocation)

链接器是否存在未调用 ld.gold 的问题。我应该用 ld.gold 替换 ld 吗?链接器是否在正确的目录中查找 .so 插件?

LLVMgold.so 和 libLTO.so 共享对象位于目录 /usr/local/llvm-devel/lib/ 中。我找不到安装 clang 的目录。我不确定在哪里创建 bfd-plugins 目录并将符号链接添加到 LLVMgold.so 和 libLTO.so。

我正在使用 freebsd 10.1 版本。如何启用黄金链接器以进行链接时间优化?还有我怎样才能使它成为默认链接器?

4

2 回答 2

1

您可能想要使用ld.gold而不是ld. 它安装在/usr/local/bin/ld.gold. 如果您使用的是 Makefile,它可以通过将 LD 变量设置为 ld.gold 来工作,或者通过修改您的 Makefile 或在命令行中指定它。如果您使用的是示例lang/clang37

gmake all CC=clang37 LD=ld.gold

编辑:

-fuse-ld=gold如果您添加到您的 LDFLAGS 中,它会更加整洁:

LDFLAGS=-fuse-ld=gold
于 2016-01-09T07:30:18.477 回答
0

我不确定 ld.bfd 是否允许插件,但我可能是错的。

/usr/bin/ld应该是你想要的任何链接器的符号链接。您可以使用 更改使用的链接器binutils-config。在此处查看手册页:http ://www.linuxhowtos.org/manpages/8/binutils-config.htm 。我意识到这是一个 Linux 链接,但它是针对 binutils 本身的,而不是专门针对 linux 的。

它应该是大体上的东西binutils-config --gold。在我的 Gentoo 盒子上是binutils --linker=gold

编辑:正如所指出的,binutils-config 似乎不适用于 BSD。不过,您仍然可以手动更新符号链接,缺点是可能会有一些。gcc -print-prog-name=ld您可以使用或找出编译器使用了哪个 ld clang -print-prog-name=ld。打印的文件应该是一个符号链接,您可以重新创建以ld.gold指向ld.bfd.

于 2015-06-22T15:07:40.740 回答