gentoo ld.gold 在 sys-libs/db 上失败
gentoo ld.gold failed on sys-libs/db
我最近从默认的 binutils linker ld.bfd 切换到 ld.gold(为了让 link 时间优化工作,为什么不呢?)。它是由手动制作的(如此处:http://wiki.gentoo.org/wiki/Gold)。结果,我得到了从 /usr/bin/ld 到 ld.gold 二进制文件的 symlinks 链,因此 linker 在构建过程中被透明地更改了。
但是当我尝试重建所有包时,我发现 ld.gold 有时会导致 configuration/compilation 失败,例如 "C compiler cannot create executables":
checking for x86_64-pc-linux-gnu-gcc... x86_64-pc-linux-gnu-gcc
checking whether the C compiler works... no
configure: error: in `/var/tmp/portage/sys-libs/db-6.0.30-r1/work/db-6.0.30/build_unix-abi_x86_64.amd64':
configure: error: C compiler cannot create executables
这实际上是 linker 问题:
configure: checking whether the C compiler works
/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.4/../../../../x86_64-pc-linux-gnu/bin/ld: --default-symver: unknown option
/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.4/../../../../x86_64-pc-linux-gnu/bin/ld: use the --help option for usage information
collect2: error: ld returned 1 exit status
但是可以使用默认的 bfd linker 成功构建包,所以问题是如何返回 bfd linker 来获取无法使用 [=30= 构建的包]?
问题包是=sys-libs/db-6.0.30-r1(暂时引起我注意的那个)。
我想到的解决方案是通过 package.env 使用每个包的环境修改。在问题包中使用了 libtool,它调用 gcc 作为 linker,所以需要添加的是 -Wl,-fuse-ld=bfd
(在 link-stage,LDFLAGS)。
所以,完整的解决方案是:
mkdir -p /etc/portage/env
echo 'LDFLAGS="${LDFLAGS} -Wl,-fuse-ld=bfd"' >> /etc/portage/env/force-bfd.conf
echo 'sys-libs/db force-bfd.conf' >> /etc/portage/package.env
我最近从默认的 binutils linker ld.bfd 切换到 ld.gold(为了让 link 时间优化工作,为什么不呢?)。它是由手动制作的(如此处:http://wiki.gentoo.org/wiki/Gold)。结果,我得到了从 /usr/bin/ld 到 ld.gold 二进制文件的 symlinks 链,因此 linker 在构建过程中被透明地更改了。
但是当我尝试重建所有包时,我发现 ld.gold 有时会导致 configuration/compilation 失败,例如 "C compiler cannot create executables":
checking for x86_64-pc-linux-gnu-gcc... x86_64-pc-linux-gnu-gcc
checking whether the C compiler works... no
configure: error: in `/var/tmp/portage/sys-libs/db-6.0.30-r1/work/db-6.0.30/build_unix-abi_x86_64.amd64':
configure: error: C compiler cannot create executables
这实际上是 linker 问题:
configure: checking whether the C compiler works
/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.4/../../../../x86_64-pc-linux-gnu/bin/ld: --default-symver: unknown option
/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.4/../../../../x86_64-pc-linux-gnu/bin/ld: use the --help option for usage information
collect2: error: ld returned 1 exit status
但是可以使用默认的 bfd linker 成功构建包,所以问题是如何返回 bfd linker 来获取无法使用 [=30= 构建的包]?
问题包是=sys-libs/db-6.0.30-r1(暂时引起我注意的那个)。
我想到的解决方案是通过 package.env 使用每个包的环境修改。在问题包中使用了 libtool,它调用 gcc 作为 linker,所以需要添加的是 -Wl,-fuse-ld=bfd
(在 link-stage,LDFLAGS)。
所以,完整的解决方案是:
mkdir -p /etc/portage/env
echo 'LDFLAGS="${LDFLAGS} -Wl,-fuse-ld=bfd"' >> /etc/portage/env/force-bfd.conf
echo 'sys-libs/db force-bfd.conf' >> /etc/portage/package.env