Versuchen Sie, Linux-Befehle zu kompilieren (Cross-Compilation-Praxis)

Versuchen Sie, Linux-Befehle zu kompilieren (Cross-Compilation-Praxis)

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 :

  1. Bitte beachten Sie, dass wir den Betrieb dieses Verfahrens nicht garantieren. Denn die auszuführende eingebettete Hardware und die jeweils geeignete Umgebung sind erforderlich.

  2. 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

Starten Sie Dccker

$ sudo docker start gcc-ubuntu
$ sudo docker exec -it gcc-ubuntu /bin/bash

Quellcode für Linux-Befehle

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!

Debian · GitLab sleepenh

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 den Quellcode

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

Kompilieren

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.

Dynamische Verbindung und statische Verbindung

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".

Überprüfen Sie die Informationen der erstellten Datei

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 Sie mit statischem Link

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.

Überprüfen Sie die Informationen der erstellten Datei (ob sie zu einem statischen Link wurde).

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

Versuchen Sie, Linux-Befehle zu kompilieren (Cross-Compilation-Praxis)
Linux-Befehl
Linux-Befehle
Linux-Befehl
[Linux] Liste der in der Praxis verwendeten Linux-Befehle
Netzwerk-Linux-Befehle
Verbalisieren Sie Linux-Befehle
Linux-Benutzerbefehle
Grundlegende LINUX-Befehle
Verschiedene Linux-Befehle
Häufig verwendete Linux-Befehle
Häufig verwendete Linux-Befehle
Häufig verwendete Linux-Befehle
[Linux] Gruppenbezogene Befehle
Linux-Befehle zum Erinnern
Linux-Befehle und Frustration studieren
Versuchen Sie es mit normaler Linux-Programmierung Teil 7
Versuchen Sie es mit normaler Linux-Programmierung Teil 2
Versuchen Sie es mit normaler Linux-Programmierung Teil 3
Versuchen Sie es mit normaler Linux-Programmierung Teil 4