xotkot
@xotkot
хорошо есть и хорошо весьма

Как на старом железе завести go (golang)?

Имеется старое железо десятилетней выдержки с процессором:
% cat /proc/cpuinfo                                                                                                     :(
processor	: 0
vendor_id	: AuthenticAMD
cpu family	: 6
model		: 6
model name	: AMD Athlon(tm) XP 2000+
stepping	: 2
cpu MHz		: 1666.576
cache size	: 256 KB
physical id	: 0
siblings	: 1
core id		: 0
cpu cores	: 1
apicid		: 0
initial apicid	: 0
fdiv_bug	: no
f00f_bug	: no
coma_bug	: no
fpu		: yes
fpu_exception	: yes
cpuid level	: 1
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov pat pse36 mmx fxsr sse syscall mmxext 3dnowext 3dnow 3dnowprefetch vmmcall
bugs		: fxsave_leak sysret_ss_attrs
bogomips	: 3334.03
clflush size	: 32
cache_alignment	: 32
address sizes	: 34 bits physical, 32 bits virtual
power management: ts


крутится на нём 32 битный Arch:
% uname -a
Linux nas 4.1.3-1-ARCH #1 SMP PREEMPT Wed Jul 22 20:52:17 CEST 2015 i686 GNU/Linux


Проблема в том что после установки пакета go, установка кстати прошло без проблем, при попытке использовать его, выдаёт:
% go
SIGILL: illegal instruction
PC=0x81f4ea9

goroutine 1 [running, locked to thread]:
math.init·1()
	/usr/lib/go/src/math/pow10.go:34 +0x19 fp=0x1872df4c sp=0x1872df48
math.init()
	/usr/lib/go/src/math/unsafe.go:21 +0x3f fp=0x1872df50 sp=0x1872df4c
strconv.init()
	/usr/lib/go/src/strconv/quote.go:455 +0x45 fp=0x1872df6c sp=0x1872df50
go/parser.init()
	/usr/lib/go/src/go/parser/parser.go:2462 +0x4a fp=0x1872df78 sp=0x1872df6c
main.init()
	/usr/lib/go/src/cmd/go/zdefaultcc.go:6 +0x45 fp=0x1872dfcc sp=0x1872df78
runtime.main()
	/usr/lib/go/src/runtime/proc.go:58 +0xbd fp=0x1872dff0 sp=0x1872dfcc
runtime.goexit()
	/usr/lib/go/src/runtime/asm_386.s:2287 +0x1 fp=0x1872dff4 sp=0x1872dff0

goroutine 2 [runnable]:
runtime.forcegchelper()
	/usr/lib/go/src/runtime/proc.go:90
runtime.goexit()
	/usr/lib/go/src/runtime/asm_386.s:2287 +0x1

goroutine 3 [runnable]:
runtime.bgsweep()
	/usr/lib/go/src/runtime/mgc0.go:82
runtime.goexit()
	/usr/lib/go/src/runtime/asm_386.s:2287 +0x1

eax     0x187360a0
ebx     0x856f650
ecx     0x187000a0
edx     0x308238f0
edi     0x7
esi     0x2b90
ebp     0x187360a0
esp     0x1872df48
eip     0x81f4ea9
eflags  0x10206
cs      0x73
fs      0x0
gs      0x33


К слову сказать, бинарники скомпилированные на другой машине под данную платформу после запуска выдают похожую проблему.

Проблема с бинарником решается если после сборки toolchain на новой машине:
% cd $(go env GOROOT)/src
% sudo GOOS=linux GOARCH=386 CGO_ENABLED=0 ./make.bash --no-clean

скомпилировать программу с параметрами:
% GOOS=linux GO386=387 GOARCH=386 go build
в общем после переноса бинарника на старую машину программа нормально работает.

Но вот как компилить программы на самой старой машине чтобы не выдавало описанную выше ошибку ?
  • Вопрос задан
  • 640 просмотров
Решения вопроса 1
xotkot
@xotkot Автор вопроса
хорошо есть и хорошо весьма
в принципе решение нашлось, для этого пришлось поменять компилятор go на gccgo, установив пакет gcc-go.
Пакеты go и gcc-go конфликтуют поэтому при установке последнего первый будет удалён автоматически.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы