From 4f31f942a53042b03f200dcf83376362dbc7f84d Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Fri, 4 Sep 2026 10:24:24 +0800 Subject: [PATCH] =?UTF-8?q?fix(build):=20arm64=20=E4=BA=A4=E5=8F=89?= =?UTF-8?q?=E7=BC=96=E8=AF=91=E8=A1=A5=20CXX=E2=80=94=E2=80=94=E3=80=8C?= =?UTF-8?q?=E5=88=BB=E6=84=8F=E4=B8=8D=E8=AE=BE=20CXX=E3=80=8D=E7=9A=84?= =?UTF-8?q?=E6=B3=A8=E9=87=8A=E5=88=A4=E6=96=AD=E6=98=AF=E9=94=99=E7=9A=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit build.sh 的 linux/arm64 分支此前刻意不设 CXX,注释理由是「设了会让 Go 用 aarch64 的 g++ 去链接,而它对 host 产生的 .o 报 file format not recognized」。 那个判断是错的。那个报错的真因是 cmd/{homed,waiter}/*.syso(x86-64 COFF Windows 资源对象)被 Go 无条件链进了目标,与 CXX 无关。四组对照: syso 在 + 无 CXX → Relocations in generic ELF (EM: 183) syso 在 + 有 CXX → 000000.o: file format not recognized syso 隐藏 + 无 CXX → Relocations in generic ELF (EM: 183) syso 隐藏 + 有 CXX → 成功,ELF aarch64 两个条件缺一不可。之前诊断时只单独试了其中一个,得出错误结论后写进 注释固化了下来,于是 arm64 的 homed 一直编不出(v1.0.0 发布时 arm64 deb 里只有 waiter/initconfig)。 本脚本的 hide_syso_for_target 已处理 syso 那半,这里补上 CXX 那半。 实测 v1.0.1:build.sh linux/arm64 直接产出 ELF aarch64,arm64 的 full/server deb 里 homed 与 waiter 均为 aarch64。 --- deploy/packaging/build.sh | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/deploy/packaging/build.sh b/deploy/packaging/build.sh index 9e78bd5..9f057bf 100644 --- a/deploy/packaging/build.sh +++ b/deploy/packaging/build.sh @@ -27,10 +27,19 @@ COMPONENT="${2:-all}" case "$TARGET" in native) GOOS="" GOARCH="" ;; linux/amd64) GOOS=linux GOARCH=amd64 CC="${CC:-}" ;; - # arm64 刻意不设 CXX:设了会让 Go 用 aarch64 的 g++ 去链接, - # 而它对 host 产生的 .o 报 "file format not recognized"。 - # gojieba 的 C++ 源仍由 CC 对应的 gcc 驱动编译(gcc 能编 C++)。 - linux/arm64) GOOS=linux GOARCH=arm64 CC="${CC:-aarch64-linux-gnu-gcc}" ;; + # arm64 必须同时给 CXX:gojieba 是 C++,缺 CXX 时 cgo 用宿主 g++ 编出 + # x86-64 的 .o,链接时报 "Relocations in generic ELF (EM: 183)"(183 = aarch64)。 + # + # 此处曾有一条注释写着「arm64 刻意不设 CXX」,理由是设了会报 + # "file format not recognized"。那个判断是错的:那个报错的真因是 + # cmd/{homed,waiter}/*.syso(x86-64 COFF Windows 资源对象)被链进了目标, + # 与 CXX 无关。四组对照: + # syso 在 + 无 CXX → Relocations in generic ELF (EM: 183) + # syso 在 + 有 CXX → 000000.o: file format not recognized + # syso 隐藏 + 无 CXX → Relocations in generic ELF (EM: 183) + # syso 隐藏 + 有 CXX → 成功,ELF aarch64 + # 本脚本的 hide_syso_for_target 已处理前一个条件,这里补上后一个。 + linux/arm64) GOOS=linux GOARCH=arm64 CC="${CC:-aarch64-linux-gnu-gcc}" CXX="${CXX:-aarch64-linux-gnu-g++}" ;; darwin/amd64) GOOS=darwin GOARCH=amd64 CC="${CC:-}" ;; darwin/arm64) GOOS=darwin GOARCH=arm64 CC="${CC:-}" ;; # Windows 必须同时给 CXX:gojieba 是 C++,缺 CXX 时 cgo 回退到宿主 g++,