DeveloperWiki:工具链维护/Binutils

出自 ArchWiki

binutils 软件包提供了一组用于汇编和操作二进制文件和目标文件的程序。

源码

binutils PKGBUILD 被设置为可以使用发布 tarball 或 git checkout。由于 binutils 很少发布错误修复版本,因此从发布分支构建以获取重要的向后移植可能很有用。或者,维护者可以选择要包含的单个补丁并使用带有 PGP 签名的发布 tarball。

如果从发布 tarball 构建,我们在 prepare() 函数期间将发布目录符号链接到 “binutils-gdb”,以统一构建过程。此外,git 中的发布分支被标记为开发版本,因此我们调整 “bfd/development.sh” 以将其设置为发布版本。

依赖

待办: 记录所有依赖项(包括 make 和 check)

准备构建

Binutils 只能在源代码树之外构建,因此我们创建了一个 “binutils-build” 目录。使用 “mkdir -p” 是为了在测试软件包更改时允许增量构建(并且在干净的 chroot 构建期间是无用的)。

Libiberty 使用 “$CPP $CPPFLAGS” 进行配置,这在使用 Arch 默认标志时会失败,因为 FORTIFY_SOURCE 需要 CFLAGS 中提供的优化。我们在 libiberty/configure 的相关行中添加了 -O2。

待办: 一个潜在的更好解决方案是将 -D_FORTIFY_SOURCE=2 移动到 CFLAGS(使用 -Wp,),无论是在 PKGBUILD 中还是在 Arch 级别。这也可能修复测试套件失败(如下所述)

配置构建

以下配置选项用于 binutils 构建

设置 Arch 中的默认路径

--prefix=/usr
--with-lib-path=/usr/lib:/usr/local/lib

我们使用我们的错误跟踪器作为 Arch 用户(以及分发软件包的衍生版本...)的首要联系点

--with-bugurl=https://bugs.archlinux.org/

添加选项以启用我们统一的 git/tarball PKGBUILD

--disable-gdb
--disable-werror

我们构建 gold 链接器,但仍然使用 bfd 链接器作为我们的默认链接器,并在使用 gold 时启用线程。Arch 在某个阶段切换到使用 gold 作为默认链接器可能是有好处的

--enable-gold
--enable-ld=default
--enable-threads

启用链接时优化支持

--enable-lto

启用链接器的插件支持

--enable-plugins

默认启用 -z,relro。这是一个安全功能。

--enable-relro

待办: makepkg.conf 中是否需要 -z,relro?

尝试仅使用 PIC 对象

--with-pic

创建可重现的归档文件 - UIDs、GIDs、时间戳归零,并对所有文件使用一致的文件模式

--enable-deterministic-archives

支持 Intel CET 指令

--enable-cet

将 BFD 和 opcodes 库构建为共享库,其中一些库我们在打包期间会删除...

--enable-shared

注意:当前已禁用' 参见 上游错误

启用生成 EFI 二进制文件 - 对于使用 Xen 设置 UEFI 启动很有用

 --enable-targets=x86_64-pep

启用使用 debuginfod 进行 debuginfo 查找

--with-debuginfod

使用系统 zlib 库,而不是 binutils 源代码中的副本

--with-system-zlib

测试套件

重要的是,在运行 binutils 测试套件之前,必须覆盖 Arch LDFLAGS。测试套件在测试各种功能时决定包含哪些 LDFLAGS,并且不忽略构建环境中的值。

在发布任何软件包之前,需要详细检查和记录 ld.bfd 链接器测试套件中的失败。由于 ld.gold 不是默认链接器,我们允许其测试套件中的失败。历史上,gold 测试套件中的这些失败是由于 Arch 构建标志造成的误报。

以下测试是当前 (binutils-2.35.1) 已知在 gold 测试套件中失败的测试

incremental_test_2
incremental_test_3
incremental_test_4
incremental_test_5
incremental_test_6
incremental_copy_test
incremental_common_test_1
incremental_comdat_test_1

待办: 调查这些失败并记录原因。请注意,测试套件尝试删除 FORTIFY_SOURCE,但假定它是在 CFLAGS 中使用 -Wp 指定的,而不是直接在 LDFLAGS 中指定的。

打包说明

我们删除了我们不分发的实用程序的 man 页面(仅限 Windows/Novell)。

我们还阻止程序动态链接到 libbfd 和 libopcodes,因为这些库相当不稳定。相反,我们提供链接器脚本来链接静态版本(及其依赖项)。