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的交叉编译支持通过GOARCHGOARM环境变量来指定目标架构,但对于大端序ARM64,需要使用特定的GOARCH值。

解决方案:

  1. 设置正确的环境变量: 对于ARM64大端序,GOARCH应设置为arm64be。同时,确保GOOS正确指定目标操作系统(例如linux)。

  2. 交叉编译命令示例: 在x86机器上,使用以下命令为ARM64大端序Linux进行交叉编译:

    GOOS=linux GOARCH=arm64be go build -o main main.go
    
  3. 验证编译结果: 编译后,可以使用readelffile命令验证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工具链。

回到顶部