跳转至内容

DeveloperWiki:Toolchain maintenance/binutils

来自 ArchWiki

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

Source(生效配置)

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

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

依赖

本文章或章节需要扩充。

原因:待办:记录所有依赖项(包括 `make` 和 `check`)。(在 DeveloperWiki talk:Toolchain maintenance/binutils 中讨论)

准备构建

Binutils 只能在源树之外构建,因此我们创建一个 `binutils-build` 目录。使用 `mkdir -p` 是为了在测试包更改时允许增量构建(在 clean chroot builds 构建期间无用)。

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

本文章或章节需要扩充。

原因:待办:一个潜在的更好的解决方案是将 `-D_FORTIFY_SOURCE=2` 移到 `CFLAGS`(使用 `-Wp,`),无论是在 `PKGBUILD` 中还是在 Arch 级别。这或许也能修复测试套件的失败(见下文)。(在 DeveloperWiki talk:Toolchain maintenance/binutils 中讨论)

配置构建

binutils 构建中使用以下配置选项

设置 Arch 中的默认路径

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

本文或本章节已过时。

原因:“我们的 bug tracker”说:“站点已迁移!我们已迁移到 GitLab!”(在 DeveloperWiki talk:Toolchain maintenance/binutils 中讨论)

我们将我们的 bug tracker 作为 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`?(在 DeveloperWiki talk:Toolchain maintenance/binutils 中讨论)

尝试仅使用 PIC 对象

--with-pic

创建可重复的存档—UID、GID、时间戳为零,所有文件的文件模式保持一致

--enable-deterministic-archives

支持 Intel CET 指令

--enable-cet

将 BFD 和 opcodes 库构建为共享库,其中一些我们在打包时删除……

--enable-shared
注意 --enable-shared 目前被禁用—请参阅 上游 bug,顺便说一句,其状态是“RESOLVED FIXED”。

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

--enable-targets=x86_64-pep

启用使用 debuginfod 进行调试信息查找

--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` 中。(在 DeveloperWiki talk:Toolchain maintenance/binutils 中讨论)

打包说明

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

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