Я пытаюсь скомпилировать кросс-платформу в Golang для работы на маршрутизаторе OpenWRT (GDock). Целевая система:
Linux OpenWrt 5.15.118 #0 SMP Ср, 5 июля 20:20:32 2023 Armv7l GNU/Linux
Название модели: Процессор ARMv7, версия 5 (v7l) БогоМИПС: 26,81 Особенности: половина большого пальца fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm Разработчик ЦП: 0x41 Архитектура процессора: 7 Вариант процессора: 0x0 Часть процессора: 0xc07 Версия процессора: 5 Я написал небольшую программу, которая печатает «Hello world», используя только модуль импорта «fmt». Программа ниже:
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello world!")
}
Я компилирую его:
GO=linux GOARM=7,softfloat GOARCH=arm /usr/local/go/bin/go build .
Я проверил файл с помощью команды file:
main: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, Go BuildID=z6RADCEu-jOWczIr0anP/cqhqMt2UfXF1iAnzuTKC/uwGWq8e4UU7E-hUo7T7S/eNInvO8n3j0q7bTGVsJ7, with debug_info, not stripped
Текущая система, которую я использовал для компиляции:
Linux ubuntu 5.15.0-107-generiC#117~20.04.1-Ubuntu SMP Tue Apr 30 10:35:57 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
Голанг-версия:
go version go1.22.2 linux/amd64
Программа работает на Ubuntu:
./main
Hello world!
Однако когда я скопировал программу на роутер, я получил Segmentation Fault. Я попытался скопировать занятое поле маршрутизатора и проверить его с помощью команды file, получил следующий результат:
busybox: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-armhf.so.1, no section header
Я искал повсюду в Интернете и не смог найти ответа, некоторые результаты были решены для CGO. Но это не моя проблема!
Почему у меня возникла ошибка сегментации? Не могу отладить из-за ресурса приборки на роутере. Как я могу это исправить?
Используете ли вы FTP для загрузки скомпилированного двоичного файла на маршрутизатор? Если да, обязательно сначала переключите режим передачи на двоичный и повторите попытку.
Видимо похожий вопрос.
@eik есть 2 файла: busybox — это динамически связанный двоичный файл, а мой файл — статически связанный двоичный файл.
Кстати, GO=linux, вероятно, это не то, что вы думаете, поскольку инструментальная цепочка Go распознает GOOS, а не только GO.
@kostix Я использовал программу openwrt для загрузки файла
Если у вас есть решение вашей проблемы, опубликуйте его в качестве ответа! Вы можете принять его, чтобы пометить вопрос как решенный.

Проблема связана с моим ftp, я проверил sha2sum и понял, что мой файл поврежден при загрузке на сервер. Итак, я использую разницу sftp-сервера и контрольной суммы, чтобы убедиться, что файл не поврежден, и тогда все сработало!
Странно, что программа компилируется для ARM и работает на вашей машине с Linux AMD64. Также странно, что он отображается как статически связанный в Ubuntu, но динамически связанный на маршрутизаторе. Что именно вы делаете, каковы хэши sha256 различных двоичных файлов?