Golang中ARM64交叉编译问题解决方案
Golang中ARM64交叉编译问题解决方案 有人知道如何为ARM64大端序进行交叉编译吗? 我尝试输入以下命令进行交叉编译:
GOOS=linux GOARCH=arm64 go build -o main main.go
但使用readelf查看时显示的是小端序ELF类型。 我只有一台x86机器用于交叉编译。
2 回复
Go 似乎不支持大端序 ARM 架构。 https://github.com/golang/go/issues/11079
更多关于Golang中ARM64交叉编译问题解决方案的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Golang中为ARM64大端序进行交叉编译,需要明确指定字节序。Golang的交叉编译支持通过GOARCH和GOARM环境变量来指定目标架构,但对于大端序ARM64,需要使用特定的GOARCH值。
解决方案:
-
设置正确的环境变量: 对于ARM64大端序,
GOARCH应设置为arm64be。同时,确保GOOS正确指定目标操作系统(例如linux)。 -
交叉编译命令示例: 在x86机器上,使用以下命令为ARM64大端序Linux进行交叉编译:
GOOS=linux GOARCH=arm64be go build -o main main.go -
验证编译结果: 编译后,可以使用
readelf或file命令验证ELF文件的字节序:readelf -h main | grep "Data:" # 或 file main输出应显示
big endian(大端序)。
完整示例:
假设有一个简单的Go程序main.go:
package main
import "fmt"
func main() {
fmt.Println("ARM64 big-endian cross-compilation test")
}
在x86机器上执行交叉编译:
GOOS=linux GOARCH=arm64be go build -o main main.go
编译后,通过file main验证,输出应类似:
main: ELF 64-bit MSB executable, ARM aarch64, version 1 (SYSV), statically linked, Go BuildID=..., not stripped
其中MSB表示大端序。
注意事项:
- 确保Go工具链版本支持
arm64be架构(Go 1.16及以上版本通常支持)。 - 如果目标环境需要特定的ARM版本(如ARMv8),可通过
GOARM环境变量指定(例如GOARM=8),但arm64be通常默认使用ARMv8。
如果编译失败,请检查Go版本是否过旧,或尝试更新Go工具链。

