技术知识库

BusyBox 1.37 ARM64 编译遇到 SHA-NI 与 TC 兼容性错误

BusyBox 1.37 ARM64 编译遇到 SHA-NI 与 TC 兼容性错误

摘要

BusyBox 1.37.0 使用默认配置交叉编译 ARM64 静态程序时同时遇到 SHA-NI 符号缺失和 tc 的 CBQ 类型缺失。前者是 BusyBox 的硬件加速选项实际只提供 x86 实现,却在 ARM64 路径引用 x86 函数;后者是旧版 BusyBox tc 与 Ubuntu 26.04 新版 Linux UAPI 头文件不兼容。最小 initramfs 不依赖这三项功能,因此关闭两个 SHA 硬件加速选项和 tc 后增量编译成功。

实际错误

SHA-1 路径:

libbb/hash_md5_sha.c:1316:35: error:
‘sha1_process_block64_shaNI’ undeclared

流量控制路径:

networking/tc.c:236:27: error: ‘TCA_CBQ_MAX’ undeclared
error: invalid application of ‘sizeof’ to incomplete type ‘struct tc_cbq_lssopt’

并行构建中,第一项失败后其他编译任务仍在运行,因此同一次日志同时暴露了两类错误。

原因

SHA 硬件加速

BusyBox 1.37.0 提供的相关汇编文件只有 x86-32 和 x86-64 版本,没有 ARM64 实现。sha1_end() 对 sha1_process_block64_shaNI 的引用只受 ENABLE_SHA1_HWACCEL 约束,缺少 x86 架构约束,导致 ARM64 构建引用未定义函数。

关闭硬件加速不会移除 sha1sum 或 sha256sum;它们继续使用通用软件实现。

BusyBox tc

BusyBox 的 networking/tc.c 使用 CBQ 相关 Linux UAPI 定义。当前主机 /usr/include/linux/pkt_sched.h 不再提供 TCA_CBQ_MAX、struct tc_cbq_lssopt 等定义,导致旧源码无法使用新头文件构建。

tc 对本次最小启动环境不是必需功能;后续 Debian 实验系统可使用 iproute2 的完整 tc。

修复

将以下配置改为关闭,并运行 make oldconfig:

# CONFIG_SHA1_HWACCEL is not set
# CONFIG_SHA256_HWACCEL is not set
# CONFIG_TC is not set

随后直接增量编译,无需清理此前成功生成的目标文件。

验证

构建成功退出,产物验证为:

busybox: ELF 64-bit LSB executable, ARM aarch64,
statically linked, for GNU/Linux 3.7.0, stripped

文件大小约 2.2 MiB。

关联