Golang中Pi Zero交叉编译的浮点数规范问题

Golang中Pi Zero交叉编译的浮点数规范问题 你好,我正在尝试将一个Go项目(syzkaller)交叉编译到树莓派Zero上,以便它能模拟USB设备。问题在于,我无法找到关于如何指定正确的浮点标志以确保与树莓派Zero兼容的信息。我尝试的所有方法都导致二进制文件中包含VMOV汇编指令,并抛出非法指令错误。我的主机是运行go1.21.4的x86_64系统,而树莓派Zero是运行go1.21.4的arm6l架构。交叉编译时,我使用的是GOOS=linux GOARCH=arm GOARM=5。我使用的Makefile可以在这里找到:syzkaller/Makefile at master · google/syzkaller · GitHub(我正在编译execprog二进制文件)。根据我的研究,GOARM=5应该强制使用软件浮点运算,但信息来源非常陈旧。也可能是我用错了这个标志,因为我对Go不太熟悉。下面是该二进制文件确切的编译参数截图。任何建议都将不胜感激,谢谢。

image


更多关于Golang中Pi Zero交叉编译的浮点数规范问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

请告诉我,我是否可以在这篇帖子中添加任何内容以获得一些帮助,或者是否这个硬件实在太旧了。谢谢。

更多关于Golang中Pi Zero交叉编译的浮点数规范问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go 1.21.4中交叉编译ARMv6(树莓派Zero)时,浮点规范问题通常是由于未正确设置GOARM环境变量导致的。树莓派Zero使用ARMv6架构,需要设置GOARM=6来启用硬件浮点支持,而不是GOARM=5

以下是正确的交叉编译命令:

# 为树莓派Zero编译(ARMv6硬件浮点)
GOOS=linux GOARCH=arm GOARM=6 CGO_ENABLED=0 go build -o execprog ./execprog

关键点:

  1. GOARM=6:指定ARMv6架构,使用硬件浮点运算
  2. CGO_ENABLED=0:禁用CGO以避免外部依赖问题
  3. 完整编译示例
# 清理并重新编译
make clean
GOOS=linux GOARCH=arm GOARM=6 CGO_ENABLED=0 make execprog

如果仍然遇到非法指令错误,可以尝试强制使用软件浮点:

# 软件浮点备选方案
GOOS=linux GOARCH=arm GOARM=5 CGO_ENABLED=0 go build -tags=softfloat -o execprog ./execprog

对于syzkaller项目,修改Makefile中的相关部分:

execprog:
    GOOS=linux GOARCH=arm GOARM=6 CGO_ENABLED=0 go build $(GCFLAGS) $(GOVERSION) -o $(BINDIR)/$@ ./execprog

验证生成的二进制文件架构:

# 检查编译后的文件
file execprog
# 应显示:ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked
回到顶部