Golang在ARM64架构上交叉编译遇到的错误
Golang在ARM64架构上交叉编译遇到的错误 我正在尝试为 arm64 架构进行编译,而我的主机架构是 amd64。
GOARCH="arm64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/works"
GORACE=""
GOROOT="/home/go"
GOTOOLDIR="/home/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
GOGCCFLAGS="-fPIC -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build513447869=/tmp/go-build -gno-record-gcc-switches"
CXX="arm-linux-gnueabi-g++"
CGO_ENABLED="1"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
abc@Ubuntu:~/works$ echo $CC_FOR_TARGET
arm-linux-gnueabi-gcc
构建命令:
go install -ldflags "-w -X main.commitVer=f7f6857 -X main.version=2.10.0"
错误: /home/go/pkg/tool/linux_amd64/link:运行 gcc 失败:退出状态 1 /usr/bin/ld: /tmp/go-link-232946962/go.o: Relocations in generic ELF (EM: 183) /usr/bin/ld: /tmp/go-link-232946962/go.o: Relocations in generic ELF (EM: 183) /usr/bin/ld: /tmp/go-link-232946962/go.o: Relocations in generic ELF (EM: 183) /usr/bin/ld: /tmp/go-link-232946962/go.o: Relocations in generic ELF (EM: 183) /usr/bin/ld: /tmp/go-link-232946962/go.o: Relocations in generic ELF (EM: 183) /usr/bin/ld: /tmp/go-link-232946962/go.o: Relocations in generic ELF (EM: 183) /usr/bin/ld: /tmp/go-link-232946962/go.o: Relocations in generic ELF (EM: 183) /usr/bin/ld: /tmp/go-link-232946962/go.o: Relocations in generic ELF (EM: 183) /tmp/go-link-232946962/go.o: error adding symbols: File in wrong format collect2: error: ld returned 1 exit status
我认为问题在于使用了错误的链接器 /home/go/pkg/tool/linux_amd64/link。我该如何更改为正确的链接器。
更多关于Golang在ARM64架构上交叉编译遇到的错误的实战教程也可以访问 https://www.itying.com/category-94-b0.html
免责声明:在提问之前,我还没有研究过 go install 是如何工作的,但是如何跨架构执行 go install?如果只是执行 go build 会有效吗?
更多关于Golang在ARM64架构上交叉编译遇到的错误的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
没关系
go build -ldflags "-w -X main.commitVer=f7f6857 -X main.version=2.10.0"
产生了相同的链接器错误。
这个错误是因为链接器使用了不匹配的目标架构。从错误信息可以看出,/home/go/pkg/tool/linux_amd64/link 是 x86_64 架构的链接器,但您正在尝试编译 ARM64 目标。
问题在于您的环境变量配置。虽然设置了 CC="gcc",但链接阶段仍然使用了错误的工具链。以下是解决方案:
1. 设置正确的交叉编译工具链
您需要为 ARM64 目标设置正确的 C 编译器:
# 安装 ARM64 交叉编译工具链
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
# 设置环境变量
export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++
export AR=aarch64-linux-gnu-ar
export LD=aarch64-linux-gnu-ld
2. 使用正确的构建命令
# 设置目标架构
export GOOS=linux
export GOARCH=arm64
# 启用 CGO 并指定交叉编译
export CGO_ENABLED=1
export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++
# 构建命令
go install -ldflags "-w -X main.commitVer=f7f6857 -X main.version=2.10.0"
3. 如果项目使用 cgo,需要完整的环境配置
#!/bin/bash
# 完整的交叉编译脚本示例
export GOOS=linux
export GOARCH=arm64
export CGO_ENABLED=1
# ARM64 特定的工具链
export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++
export AR=aarch64-linux-gnu-ar
export STRIP=aarch64-linux-gnu-strip
# 构建
go build -o output-arm64 -ldflags "-w -X main.commitVer=f7f6857 -X main.version=2.10.0"
4. 验证工具链是否正确
# 检查编译器架构
aarch64-linux-gnu-gcc --version
# 应该显示 aarch64-linux-gnu 目标
# 检查 Go 工具链
go env GOOS GOARCH
# 应该显示 linux arm64
5. 如果仍然有问题,尝试禁用 CGO
如果项目不依赖 C 库,可以完全禁用 CGO:
export CGO_ENABLED=0
export GOOS=linux
export GOARCH=arm64
go install -ldflags "-w -X main.commitVer=f7f6857 -X main.version=2.10.0"
6. 使用 Go 1.16+ 的交叉编译改进
Go 1.16 及以上版本对交叉编译有更好的支持:
# 简单的交叉编译(无 CGO)
GOOS=linux GOARCH=arm64 go build -ldflags "-w -X main.commitVer=f7f6857 -X main.version=2.10.0"
# 带 CGO 的交叉编译
GOOS=linux GOARCH=arm64 CGO_ENABLED=1 CC=aarch64-linux-gnu-gcc go build -ldflags "..."
关键点是确保 CC 环境变量指向正确的 ARM64 交叉编译器,而不是默认的 x86_64 gcc。这样链接器就会使用正确的工具链来处理 ARM64 目标文件。

