交叉编译Go至FreeBSD 13.2 ARM平台时遇非法指令问题求助
交叉编译Go代码到FreeBSD ARM设备时出现“非法指令”错误
目标设备信息
quark$ uname -a FreeBSD quark 13.2-RELEASE FreeBSD 13.2-RELEASE releng/13.2-n254617-525ecfdad597 RPI-B arm
本地编译环境
archlinux$ uname -a Linux archlinux 6.7.6-arch1-1 #1 SMP PREEMPT_DYNAMIC Fri, 23 Feb 2024 16:31:48 +0000 x86_64 GNU/Linux archlinux$ go version go version go1.22.0 linux/amd64
待编译Go代码
package main import ( "fmt" "time" ) func main() { t := time.Now().UTC() fmt.Println("Now:", t.Format(time.RFC3339Nano), "!") }
编译步骤
archlinux$ export GOARCH=arm archlinux$ export GOOS=freebsd archlinux$ export GOARM=6 archlinux$ go build time.go archlinux$ file time time: ELF 32-bit LSB executable, ARM, EABI5 version 1 (FreeBSD), statically linked, for FreeBSD 12.3, FreeBSD-style, Go BuildID=xdfWXxT__aMomffvV1zx/MU0rcYoRAe-TcUCtTzOB/NTCZChXbctQS2ubirhCR/-Ez3jurVLV9a1Wskk5xa, with debug_info, not stripped
执行错误
将编译后的二进制文件复制到目标设备执行,出现以下错误:
quark$ file time time: ELF 32-bit LSB executable, ARM, EABI5 version 1 (FreeBSD), statically linked, for FreeBSD 12.3, FreeBSD-style, Go BuildID=xdfWXxT__aMomffvV1zx/MU0rcYoRAe-TcUCtTzOB/NTCZChXbctQS2ubirhCR/-Ez3jurVLV9a1Wskk5xa, with debug_info, not stripped quark$ ./time Illegal instruction (core dumped)
解决方法
“非法指令”错误一般是因为二进制包含目标CPU不支持的指令集,针对RPI-B(ARMv6架构),可尝试以下调整:
关闭CGO编译:CGO可能引入依赖系统的C代码,导致指令集不兼容,编译时添加
CGO_ENABLED=0:archlinux$ export GOARCH=arm archlinux$ export GOOS=freebsd archlinux$ export GOARM=6 archlinux$ export CGO_ENABLED=0 archlinux$ go build -o time time.go使用单条命令编译:直接通过环境变量参数指定所有配置,避免环境变量冲突:
archlinux$ GOARCH=arm GOOS=freebsd GOARM=6 CGO_ENABLED=0 go build -o time time.go验证指令集兼容性:编译完成后,用
readelf检查二进制的CPU架构:archlinux$ readelf -A time | grep "Tag_CPU_name"正常输出应为
Tag_CPU_name: "ARMv6",确保与目标设备匹配。
内容的提问来源于stack exchange,提问作者gorillafan1991
相关产品推荐
相关产品推荐

