go - 为 MIPS 构建一个没有硬件浮点的小型 Go 程序(需要 softfloat)

标签 go mips embedded-linux mips32 cgo

我有一个用 go 编写的小程序,我正在尝试交叉编译以在 MIPS 架构机器上运行。我一直在尝试使用 XGO 交叉编译库进行交叉编译,但在让我的程序运行方面取得了有限的成功 (https://github.com/karalabe/xgo)。

这里是设备的cpuinfo,当前运行的是某个版本的openwrt。

system type     : Qualcomm Atheros QCA9533 ver 2 rev 0
machine         : GL.iNet GL-AR750
processor       : 0
cpu model       : MIPS 24Kc V7.4
BogoMIPS        : 432.53
wait instruction    : yes
microsecond timers  : yes
tlb_entries     : 16
extra interrupt vector  : yes
hardware watchpoint : yes, count: 4, address/irw mask: [0x0ffc, 0x0ffc, 0x0ffb, 0x0ffb]
isa         : mips1 mips2 mips32r1 mips32r2
ASEs implemented    : mips16
shadow register sets    : 1
kscratch registers  : 0
package         : 0
core            : 0
VCED exceptions     : not available
VCEI exceptions     : not available

运行该程序,我从以下内容中得到一条 SIGILL 非法指令:

Program terminated with signal SIGILL, Illegal instruction.
#0  0x008274a8 in __sigsetjmp_aux () 

我可以看到这里定义了__sigsetjmp_aux()

/usr/lib/gcc-cross/mips-linux-gnu/5/../../../../mips-linux-gnu/lib/../lib/libc.a(setjmp_aux.o): definition of __sigsetjmp_aux 

如何确保我的所有依赖项都使用 SOFTFLOAT 编译?

我一直在向 xgo 传递以下环境变量,但似乎 GLIBC 没有被编译为 soft-float

CC=mips-linux-gnu-gcc-5 CXX=mips-linux-gnu-g++-5 GOOS=linux GOARCH=mips GOMIPS=softfloat CGO_ENABLED=1 CFLAGS=msoft-float

如有任何帮助,我们将不胜感激!

编辑 这是 asm 布局

    0x8274a4 <__sigsetjmp_aux+4>    addiu  gp,gp,-19312                                                                                                                          │
  >│0x8274a8 <__sigsetjmp_aux+8>    sdc1   $f20,56(a0)                                                                                                                           │
   │0x8274ac <__sigsetjmp_aux+12>   sdc1   $f22,64(a0) 

最佳答案

我不得不在 MIPS 上运行 Go 一次,并通过使用浮点仿真构建内核解决了这个问题。它很慢,但很管用。

关于go - 为 MIPS 构建一个没有硬件浮点的小型 Go 程序(需要 softfloat),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56138616/

相关文章:

linux - 我们怎么知道我们在自旋锁中?

raspberry-pi - 如何使用树莓派或任何其他 Linux PC 或设备创建虚拟/模拟 USB 鼠标

ssl - 使用 Golang 在 Nginx 后面运行的 GRPC 服务的 TLS

golang goroutines, chanel 和 sync.WaitGroup

python - Gmail SMTP 身份验证总是失败

go - 使用Iris将HTTP转发到https

c - 在 C 和汇编中移动

将 C 代码转换为汇编 Mips 语言

c - 我怎样才能将这个C 转换成MIPS?

javascript - 有人尝试在嵌入式环境中运行node.js 或原始v8 引擎吗?