Невозможен запуск любой, даже простейшей программы (Hello world) на Go на WI-CAT-AX. Программа падает с ошибкой fatal error: sigaction failed
.
Вывод программы
Под каждой строкой с отылкой на исходный код рантайма Go я добавил #комментарий с собственно кодом, который содержится на этой строке рантайма Go.
fatal error: sigaction failed
runtime stack:
runtime.throw({0xd5345, 0x10})
/usr/lib/go-1.21/src/runtime/panic.go:1077 +0x54 fp=0x7fffe880 sp=0x7fffe86c pc=0x52248
# fatalthrow(throwTypeRuntime)
runtime.sysSigaction.func1()
/usr/lib/go-1.21/src/runtime/os_linux.go:560 +0x4c fp=0x7fffe88c sp=0x7fffe880 pc=0x87bc0
# throw("sigaction failed")
runtime.sysSigaction(0x80, 0x0, 0x7fffe8bc)
/usr/lib/go-1.21/src/runtime/os_linux.go:559 +0x7c fp=0x7fffe8a4 sp=0x7fffe88c pc=0x4ebc4
# systemstack(func() {
runtime.sigaction(...)
/usr/lib/go-1.21/src/runtime/sigaction.go:15
# sysSigaction(sig, new, old)
runtime.getsig(...)
/usr/lib/go-1.21/src/runtime/os_linux.go:526
# sigaction(i, nil, &sa)
runtime.initsig(0x0)
/usr/lib/go-1.21/src/runtime/signal_unix.go:134 +0x100 fp=0x7fffe8e0 sp=0x7fffe8a4 pc=0x6dc28
# fwdSig[i] = getsig(i)
runtime.mstartm0()
/usr/lib/go-1.21/src/runtime/proc.go:1624 +0x70 fp=0x7fffe8e8 sp=0x7fffe8e0 pc=0x599a8
# initsig(false)
runtime.mstart1()
/usr/lib/go-1.21/src/runtime/proc.go:1596 +0x94 fp=0x7fffe8f8 sp=0x7fffe8e8 pc=0x598a0
# mstartm0()
runtime.mstart0()
/usr/lib/go-1.21/src/runtime/proc.go:1557 +0x7c fp=0x7fffe90c sp=0x7fffe8f8 pc=0x597ec
# mstart1()
runtime.mstart()
/usr/lib/go-1.21/src/runtime/asm_mipsx.s:89 +0x14 fp=0x7fffe910 sp=0x7fffe90c pc=0x8b2e8
# JAL runtime·mstart0(SB)
goroutine 1 [runnable]:
runtime.main()
/usr/lib/go-1.21/src/runtime/proc.go:144 fp=0x42a7ec sp=0x42a7ec pc=0x55904
# func main() {
runtime.goexit()
/usr/lib/go-1.21/src/runtime/asm_mipsx.s:641 +0x4 fp=0x42a7ec sp=0x42a7ec pc=0x8d71c
# NOR R0, R0 // NOP
На всякий случай уточню: программы на Go компилируются статически и, грубо говоря, не имеют зависимостей.
Проблема, видимо, скорее связана с особенностями ОС WIVE-NG-HQ, а не железа, т.к. проявляется и на других устройствах с этой ОС. Проблема подтверждается другими пользователями:
- https://4pda.to/forum/index.php?showtopic=1055556&view=findpost&p=125057466
- https://4pda.to/forum/index.php?showtopic=889960&view=findpost&p=100574799
-
Если доверяете собранному мной Hello world на Go, воспроизвести можно просто. Выполните на роутере:
wget -P /tmp https://github.com/shvchk/tmp/raw/main/hello && chmod +x /tmp/hello && $_
Программа должна просто вывести Hello, World!
Вместо этого вы получите ту же ошибку, что я привёл выше.
-
Если не доверяете собранному мной исполняемому файлу, можете собрать его самостоятельно.
Самостоятельная сборка
-
Сохраните код Hello world из примера в файл
hello.go
. Либо скачайте готовыйhello.go
с тем же кодом.Код, думаю, самоочевиден: программа просто выводит Hello, World!
Код hello.go
package main import "fmt" func main() { fmt.Println("Hello, World!") }
-
Откройте терминал в папке с файлом
hello.go
-
Запустите сборку в одноразовом официальном контейнере Go:
docker run --rm -v ./:/go -e GOOS=linux -e GOARCH=mipsle golang go build -ldflags "-s -w" hello.go
-
Либо, если вам удобнее без контейнера, на хост системе, установите пакет
golang
, затем запустите сборку:GOOS=linux GOARCH=mipsle golang go build -ldflags "-s -w" hello.go
-
В результате получите ~такой же исполняемый файл, что я выложил выше. Скопируйте его на роутер и запустите:
chmod +x /путь/к/hello; $_
Программа должна просто вывести Hello, World!
Вместо этого вы получите ту же ошибку, что я привёл выше.
-
Вот некоторая информация о получившемся исполняемом файле:
# ldd hello
$ not a dynamic executable
# file hello
hello: ELF 32-bit LSB executable, MIPS, MIPS32 version 1 (SYSV), statically linked, Go BuildID=GhgTAPoTM02vpSPkOyGX/bD2Cv_JrgZGMHicinb5I/HRa-TMicqjgG4mzkFyxy/VlProQqsUZY6VE9xorpY, with debug_info, not stripped
Для решения проблемы может пригодиться информация о требованиях Go к ОС
Для написания/использования приложений на Go. Речь и о power-users, и об операторах и других крупных заказчиках, которые могут дополнять роутеры своим ПО.