24.5 在 Linux 系统上交叉构建 FreeBSD

设备环境

  • Ubuntu 24.04 LTS

  • 内存建议不低于 12 GB

  • Swap 建议为 16 GB

安装软件包

# apt update  # 刷新软件源,部分用户可能需要更换软件源
# apt install git build-essential libbz2-dev libarchive-dev libssl-dev flex  # 安装构建所需的软件包和开发库

禁用熄屏

依次进入“设置” → “电源” → “节电选项”,然后将“熄屏”选项设置为“从不”。

禁用 systemd-oomd

自 Ubuntu 22.04 LTS(Desktop)以降,系统默认启用了 systemd-oomd 这一服务,该服务会在系统达到某阈值时强制结束当前高占用的进程,导致构建失败。且这一操作不会向用户提供任何提示信息。

  • 禁用 systemd-oomd 的自启动,并立即停止其运行

# systemctl mask --now systemd-oomd systemd-oomd.socket     # 立即禁用并屏蔽 systemd-oomd 及其 socket 单元
  • 检查 systemd-oomd 的运行状态

创建放置构建产物的目录

创建目录 bsdobj;若其父目录不存在,则一并创建:

使用 git 拉取 FreeBSD 源代码

拉取 FreeBSD 源码仓库:

拉取完成后,源代码应位于 /home/ykla/freebsd-srcfreebsd-src 目录由 Git 自动创建)。

构建工具链与世界(用户空间)

切换到 FreeBSD 源码树根目录:

指定对象目录并使用 make.py 构建 arm64/aarch64 的基本系统,同时启用 AArch64 和 ARM 的 LLVM 后端,并禁用 32 位库支持:

选项注释:

项目
说明

MAKEOBJDIRPREFIX=/home/ykla/bsdobj

指定所有构建产物的输出目录

tools/build/make.py

在非 FreeBSD 系统上启动构建流程的官方脚本

--bootstrap-toolchain

用源码树里的 LLVM/Clang/LLD 自举工具链,而非通过 apt 安装,使之更接近原生构建

-j16

启用 16 个并行编译任务。一般与 CPU 线程数一致,例如 4 线程可使用 -j4

TARGET=arm64

目标平台设为 arm64

TARGET_ARCH=aarch64

目标 CPU 架构设为 aarch64

WITH_LLVM_TARGET_AARCH64=yes

启用 LLVM 的 AArch64 后端

WITH_LLVM_TARGET_ARM=yes

启用 LLVM 的 ARM 后端

WITHOUT_LIB32=yes

禁用 32 位兼容库及相关组件,因为测试未通过

buildworld

构建 FreeBSD 用户空间(world)

验证:

构建内核工具链

确保当前仍位于 FreeBSD 源码树根目录:

使用与 buildworld 相同的参数构建内核工具链:

除末尾的 kernel-toolchain 不同外,其余选项参数均保持一致。

验证结果:

构建内核

确保当前仍位于 FreeBSD 源码树根目录:

使用指定参数构建 arm64/aarch64 内核:

除了末尾的 buildkernel 有变化,其他选项参数均一致。

验证结果:

附录:RISC-V 64

使用引导工具链并忽略 GCC 检测,构建 riscv64 架构的内核工具链:

验证:

使用引导工具链并忽略 GCC 检测,构建 riscv64 内核:

验证:

故障排除与未竟事宜

基于 Archlinux 构建 FreeBSD

要在 Arch 上编译,需要设置临时环境变量:

否则构建过程会停留在 krb5 阶段。这是由于 glibc 同时支持 POSIX 和 GNU 两种规范所致。

此外,还必须确保 hostname 命令存在且能够正常输出,同时需安装 time 等软件包。

32 位构建的问题

FreeBSD 15.0 已不再支持任何 32 位架构。

Ubuntu 原生的 LLVM 工具链

待测试

构建更多体系结构(如 amd64)

待解决

参考文献

最后更新于