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

3 回复

免责声明:在提问之前,我还没有研究过 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 目标文件。

回到顶部