Skip to content

Instantly share code, notes, and snippets.

@shvchk
Last active September 17, 2023 14:49
Show Gist options
  • Save shvchk/3f6133dfbd8195dd8ad21f8509368321 to your computer and use it in GitHub Desktop.
Save shvchk/3f6133dfbd8195dd8ad21f8509368321 to your computer and use it in GitHub Desktop.
На WI-CAT-AX / WIVE-NG-HQ не работают программы на Go

Проблема

Невозможен запуск любой, даже простейшей программы (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, а не железа, т.к. проявляется и на других устройствах с этой ОС. Проблема подтверждается другими пользователями:

Как воспроизвести

  • Если доверяете собранному мной 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, и об операторах и других крупных заказчиках, которые могут дополнять роутеры своим ПО.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment