Próbuję skompilować małą aplikację za pomocą biblioteki Gopacket do Linux na 32bit CPU MIPS. Niestety otrzymuję takie mnóstwo błędów:

/home/cdutz/go/pkg/mod/github.com/google/gopacket@v1.1.19/pcap/pcap.go:30:22: undefined: pcapErrorNotActivated

Na "normalnym" systemie Linux wydają się być zdefiniowane w "PCAP_UNIX.GO", podczas gdy w systemie Windows wartości pochodzą z "defs_windows_amd64.go". Mam libpcap w wersji 32bit MIPS w moim systemie docelowym, co jest dobre, ponieważ mój system docelowy nie ma dodatkowej przestrzeni do zainstalowania wszystkich narzędzi potrzebnych do skompilowania niczego na nim. Wiem, że libpcap nie istnieje jako wersja 1 do 1 w oknach, więc prawdopodobnie wyjaśnia "Defs" -files. Ale na ogół oczekuję tego samego API jak ten w moim systemie Linux.

[Aktualizacja] Dlatego wydaje się numerem 1 rzeczy, które należy zapewnić, jest to, że CGO jest wykonywany. Odbywa się to poprzez ustawienie zmiennej środowiskowej:

CGO_ENABLED=1

Następnie musimy mieć pewność, że zainstalowane są kompatybilne z MIPS wersje LibpCap (pliki nagłówka są identyczne na dowolnej architekturze). Aby to zrobić na moim Ubuntu 16.4, najpierw musiałem włączyć architekturę "MIPS":

dpkg --add-architecture mips

I dodaj repo debiana do /etc/apt/sources.list

deb [trusted=yes] http://ftp.de.debian.org/debian buster main

Jak tylko to zrobiłem, mogłem zainstalować binaryzacje mipsowe:

apt install libpcap-dev:mips libpcap0.8-dev:mips libc6-dev:mips libdbus-1-dev:mips libpcap0.8:mips

W celu przekroczenia kompilacji wydaje się, że potrzebuję wersji GCCGO, która może to zrobić. Za to zainstalowałem:

apt-get install gccgo-mips-linux-gnu

Nadchodzi teraz coś, czego nie jestem pewien, czy zrobiłem dobrze, ale podczas prowadzenia budowy z kompilarką = GCCGO zawsze wybrał wersję AMD64 i za pomocą czegoś innego, ale "GCCGO" jako argument kompilatora nie działa, więc zaktualizowałem symbolikę w / USR / BIN / GCCGO, aby wskazać: "MIPS-Linux-GNU-GCCGO-8" (w tym samym katalogu).

Po tych wszystkich zmianach udało mi się prawie zbudować wszystko z tym poleceniem:

go build -compiler=gccgo

Jeśli włączę dodatkowe wyjście z opcją "-x", widzę, że CGO teraz robi to wszystko. Kompiluje również wszystkie inne moduły. Ale na PCAP jeden już nie powiedzie się:

cc1: error: command line option '-c' is valid for the driver but not for C

Więc właśnie tam utknąłem.

2
Christofer Dutz 12 luty 2021, 11:27

1 odpowiedź

Najlepsza odpowiedź

OK, po 3 dniach myślę, że udało mi się działać rzeczy, a ja podsumowuję to, co zrobiłem.

W końcu ścieżka GCCGO była martwym końcem, więc zamiast instalować gccgo-mips-linux-gnu zainstalowałem gcc-mips-linux-gnu.

Następnie Ustawiam zmienną środowiskową CC, aby wskazać to:

 export CC=/usr/bin/mips-linux-gnu-gcc-8

Właściwie to było, czego brakowało.

Więc podsumowując go na moim systemie Ubuntu 16.04:

dpkg --add-architecture mips
echo "deb [trusted=yes] http://ftp.de.debian.org/debian buster main" > /etc/apt/sources.list
apt update
apt install -y wget git build-essential mc
apt install -y gcc-mips-linux-gnu
apt install -y libpcap-dev:mips libpcap0.8-dev:mips libc6-dev:mips libdbus-1-dev:mips libpcap0.8:mips

export CC=/usr/bin/mips-linux-gnu-gcc-8
export GOOS=linux
export GOARCH=mips   
export GOMIPS=softfloat
export CGO_ENABLED=1

go build

Mam nadzieję, że może to pomóc innym.

1
Christofer Dutz 11 marzec 2021, 16:39