Als Beispiel für die Cross-Compilation-Praxis erstellen wir ein Programm unter Ubuntu, das unter Linux mit einer MIPS-CPU ausgeführt wird. Bei praktischen Übungen sind Linux-Befehle, die normalerweise verwendet werden können, häufig keine eingebetteten Geräte, was ein Problem sein kann. Diesmal ist es ein Beispiel für einen solchen Fall.
bitte beachten Sie :
Bitte beachten Sie, dass wir den Betrieb dieses Verfahrens nicht garantieren. Denn die auszuführende eingebettete Hardware und die jeweils geeignete Umgebung sind erforderlich.
Wir werden die in diesem Artikel vorgestellte Umgebung verwenden. Bereiten Sie die Umgebung daher anhand des Artikels vor. Erstellen einer Gcc-Cross-Compile-Umgebung mit Docker unter Ubuntu von VirtualBox unter Mac
$ sudo docker start gcc-ubuntu
$ sudo docker exec -it gcc-ubuntu /bin/bash
Nehmen Sie diesmal den Befehl sleepenh als Beispiel. Es war leicht zu finden, also bringe ich es von Debian. Ich weiß nicht, ob das in Ordnung ist!
Referenz: So finden Sie das Paket, das den Befehl enthält (Beispiel in Ubuntu) Führen Sie den Befehl auf dem Computer aus, auf dem er vorhanden ist.
root@af48c1a975a2:~# which bash #Überprüfen Sie den Speicherort des Befehls
/bin/bash
root@af48c1a975a2:~# dpkg --search /bin/bash #Kann mit dpkg untersucht werden
bash: /bin/bash
Sie können sehen, dass das "bash" -Paket den Befehl / bin / bash enthält.
Holen Sie sich das Paket im Quellcode
root@af48c1a975a2:~/dev# mkdir sleepenh #Erstellen Sie ein Arbeitsverzeichnis
<Bitte führen Sie die Dateierfassungs- und Übertragungsmethode in der Docker-Umgebung entsprechend Ihrer eigenen Umgebung durch. Ausgelassen>
sleepenh-master.Habe einen Reißverschluss
root@af48c1a975a2:~/dev/sleepenh# unzip sleepenh-master.zip
root@af48c1a975a2:~/dev/sleepenh# cd sleepenh-master
Wenn Sie mit Makefaile kompilieren, wird es nicht übergreifend kompiliert. Ändern Sie daher das Makefile.
root@af48c1a975a2:~/dev/sleepenh/sleepenh-master# vi Makefile
Der modifizierte Teil ist die Position von "CC =" und ändert gcc in mips-linux-gnu-gcc. Sie können jetzt sleepenh für MIPS auf Ihrem PC kompilieren. (Kreuzzusammenstellung)
Q ?= @
ifneq ($(Q),@)
Q :=
endif
CC = mips-linux-gnu-gcc
CFLAGS = -std=gnu11 -Wall -Wextra -O2 $(EXTRA_CFLAGS)
<< Unten weggelassen >>
machen
root@af48c1a975a2:~/dev/sleepenh/sleepenh-master# make
/bin/sh: 1: git: not found
mips-linux-gnu-gcc -std=gnu11 -Wall -Wextra -O2 -DVCSVERSION='' sleepenh.c -o sleepenh
gzip -9 < sleepenh.1 > sleepenh.1.gz
root@af48c1a975a2:~/dev/sleepenh/sleepenh-master# ls
Makefile Makefile.org changelog debian sleepenh sleepenh.1 sleepenh.1.gz sleepenh.c
sleepenh wurde zusammengestellt.
Um ein Programm einfach schreiben zu können, ist es wichtig, die bereitgestellte Bibliothek zu verwenden. Es wird auch häufig in Befehlen verwendet. Wenn zu diesem Zeitpunkt ein Problem mit der Bibliothek auf einem PC oder Server auftritt, ist es praktisch, nur die Bibliothek zu aktualisieren. Daher ist es üblich, dass Programme kompilieren, um dynamisch auf die Bibliothek zu verweisen (dynamischer Link).
In einer eingebetteten Umgebung ist es jedoch praktisch, in verschiedenen Umgebungen zu arbeiten, z. B. in keiner Bibliothek oder nicht in allen Versionen. Um die referenzierte Bibliothek zu reparieren, kann sie daher in Form der Einbindung der Bibliothek in die Ausführungsbinärdatei (statische Verknüpfung) kompiliert werden, damit sie nicht von der externen Umgebung beeinflusst wird.
Wenn Sie gcc mit der Option -static kompilieren, handelt es sich um eine "statische Verknüpfung", andernfalls um eine "dynamische Verknüpfung".
Lassen Sie uns den Befehl sleepenh überprüfen, der tatsächlich erstellt wurde.
root@af48c1a975a2:~/dev/sleepenh/sleepenh-master# file sleepenh
sleepenh: ELF 32-bit MSB executable, MIPS, MIPS-I version 1 (SYSV), dynamically linked, interpreter /lib/ld., for GNU/Linux 3.2.0, with debug_info, not stripped
Sie können sehen, dass eine dynamisch verknüpfte ausführbare Datei für MIPS erstellt wurde (MIPS, MIPS-I Version 1 (SYSV)). Da es sich um eine dynamische Verbindung handelt, hängt sie von der Betriebsumgebung ab. In einigen Fällen gibt es möglicherweise keine Bibliothek, auf die verwiesen werden kann.
Kompilieren wir also mit einem statischen Link.
Erstellen Sie eine Kopie jedes Verzeichnisses und bereiten Sie es für einen späteren Vergleich vor.
root@af48c1a975a2:~/dev/sleepenh# cd ~/dev/sleepenh/
root@af48c1a975a2:~/dev/sleepenh# cp -r sleepenh-static sleepenh-static
root@af48c1a975a2:~/dev/sleepenh# cd sleepenh-static
root@af48c1a975a2:~/dev/sleepenh/sleepenh-static# make clean #Aufräumen
Ändern Sie das Makefile, um es mit statischen Links zu kompilieren.
root@af48c1a975a2:~/dev/sleepenh/sleepenh-static# vi Makefile
Fügen Sie für den Korrekturteil "-static" an die Stelle von "CFLAGS =". Sie können jetzt sleepenh für MIPS mit statischen Links auf Ihrem PC kompilieren. (Kreuzzusammenstellung)
Vorher ändern
CFLAGS = -std=gnu11 -Wall -Wextra -O2 $(EXTRA_CFLAGS)
Nach der veränderung
CFLAGS = -std=gnu11 -Wall -static -Wextra -O2 $(EXTRA_CFLAGS)
Nach der veränderung
Q ?= @
ifneq ($(Q),@)
Q :=
endif
CC = mips-linux-gnu-gcc
CFLAGS = -std=gnu11 -Wall -static -Wextra -O2 $(EXTRA_CFLAGS)
<< Unten weggelassen >>
machen
root@af48c1a975a2:~/dev/sleepenh/sleepenh-static# make
/bin/sh: 1: git: not found
mips-linux-gnu-gcc -std=gnu11 -Wall -static -Wextra -O2 -DVCSVERSION='' sleepenh.c -o sleepenh
gzip -9 < sleepenh.1 > sleepenh.1.gz
root@af48c1a975a2:~/dev/sleepenh/sleepenh-master# ls
Makefile Makefile.org changelog debian sleepenh sleepenh.1 sleepenh.1.gz sleepenh.c
sleepenh wurde zusammengestellt.
Lassen Sie uns den Befehl sleepenh überprüfen, der tatsächlich erstellt wurde.
sleepenh: ELF 32-bit MSB executable, MIPS, MIPS-I version 1 (SYSV), statically linked, for GNU/Linux 3.2.0, with debug_info, not stripped
Sie können sehen, dass eine statisch verknüpfte ausführbare Datei für MIPS erstellt wurde (MIPS, MIPS-I Version 1 (SYSV)). Wenn es sich um eine statische Verbindung handelt, funktioniert sie unabhängig von der Betriebsumgebung. In einigen Fällen gibt es möglicherweise keine Bibliothek, auf die verwiesen werden kann, dies ist jedoch kein Problem.
Nehmen Sie die mit diesem statischen Link kompilierte Person zum MIPS Linux-Gerät und testen Sie den Vorgang.
Recommended Posts