x86_64环境Golang交叉编译aarch64/arm64二进制链接失败如何解决
问题1解答:获取arm64架构链接器的方法
不需要自行交叉编译链接器,Debian 11官方软件源已经提供完整的aarch64交叉编译工具链,包含对应架构的链接器。
执行以下命令即可安装:
sudo apt update && sudo apt install gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu
安装完成后,aarch64架构的交叉链接器路径为/usr/bin/aarch64-linux-gnu-ld,会被交叉gcc自动调用,无需单独配置。
你当前遇到的file in wrong format报错,是因为编译命令的变量展开问题导致实际调用的是宿主机x86_64架构的默认/usr/bin/ld,无法识别arm64格式的目标文件,不是缺少交叉链接器导致的。
问题2解答:GOTOOLDIR路径说明
GOTOOLDIR指向/usr/lib/go-1.15/pkg/tool/linux_amd64属于正常现象,不属于错误配置。
GOTOOLDIR的作用是指定当前宿主机运行的Go工具链二进制文件的存放路径,你在x86_64架构设备上执行编译操作,运行的Go工具本身就是x86_64架构的,因此路径必然指向linux_amd64,和最终生成的目标程序架构无关,不需要修改。
完整编译步骤
- 清理之前的错误编译缓存,避免残留文件影响:
go clean -cache
- 执行正确的交叉编译命令,两种写法均可:
写法一:先导出环境变量再编译,避免变量展开失效
export CC=aarch64-linux-gnu-gcc GOOS=linux GOARCH=arm64 CGO_ENABLED=1 go build -v -ldflags="-extld=$CC"
写法二:直接指定交叉gcc路径,省略变量引用
GOOS=linux GOARCH=arm64 CGO_ENABLED=1 go build -v -ldflags="-extld=aarch64-linux-gnu-gcc"
编译过程中出现的sqlite3相关警告属于上游依赖代码的编码提示,不影响最终二进制的正常运行,可以直接忽略。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

