Создание небольшой программы Go для MIPS без аппаратной плавающей запятой (требуется плавное плавание) - PullRequest
4 голосов
/ 15 мая 2019

У меня есть небольшая программа, написанная на 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) 

Ответы [ 2 ]

4 голосов
/ 15 мая 2019

Мне пришлось один раз запустить Go на MIPS, и я решил проблему, собрав ядро ​​с эмуляцией с плавающей запятой.Это медленно, но работает.

3 голосов
/ 15 мая 2019

В дополнение к CFLAGS=-msoft-float добавьте CGO_CFLAGS=-msoft-float и CGO_LDFLAGS=-msoft-float. Обратите внимание, что это будет работать, только если у вас установлена ​​мягкая версия libc.a; ищите /usr/lib/gcc-cross/mips-linux-gnu/5/../../../../mips-linux-gnu/lib/../lib/soft-float/libc.a (в конце я добавил каталог soft-float).

...