跳转至内容

DeveloperWiki:Toolchain maintenance/binutils

来自 ArchWiki

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

Source(生效配置)

binutils 的 PKGBUILD 设置为可以使用发布版的 tarball 或 git 检出。由于 binutils 很少发布缺陷修复版本,因此从发布分支构建以获取重要的 backports 可能会很有用。或者,维护者可以选择包含特定的补丁,并使用具有 PGP 签名的发布版 tarball。

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

依赖

本文章或章节需要扩充。

原因: 待办: 文档化所有依赖项(包括 makecheck)。(在 DeveloperWiki talk:Toolchain maintenance/binutils 中讨论)

准备构建

Binutils 只能在源码树之外构建,因此我们创建了一个 binutils-build 目录。使用 mkdir -p 是为了在测试软件包更改时允许增量构建(而在 干净的 chroot 构建 中则没有必要)。

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

本文或本章节已过时。

原因: “我们的缺陷追踪器”显示:“站点已迁移!我们已迁移到 GitLab!”(在 DeveloperWiki talk:Toolchain maintenance/binutils 中讨论)

我们将自己的缺陷追踪器作为 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

启用链接时优化 (LTO) 支持

--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 目前被禁用——请参阅 上游缺陷报告,顺便一提,其状态为“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,但它假设该项是通过 -WpCFLAGS 中指定的,而不是直接在 LDFLAGS 中。(在 DeveloperWiki talk:Toolchain maintenance/binutils 中讨论)

打包注意事项

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

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

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.