Mit dem Aufkommen von Open-Source-Software und der Akzeptanz dieser Lösungen zur Erstellung komplexer Systeme wird die Fähigkeit, Anwendungen zu entwickeln, die nahtlos auf mehreren Hardwareplattformen ausgeführt werden können, grundsätzlich wichtig.Es besteht ein ständiger Bedarf, die Software auf einer Architektur zu entwickeln, aber die Fähigkeit zu haben, diese auf anderen Zielarchitekturen auszuführen. Eine gängige Technik, um dies zu erreichen, ist die plattformübergreifende Kompilierung der Anwendung für die Zielarchitektur.
Cross-Kompilierung ist in eingebetteten Systemen wichtig, wo die Absicht besteht, Anwendungen auf spezieller Hardware wie ARM- und PowerPC-Platinen auszuführen. Diese Systeme sind ressourcenbeschränkt, daher ist eine direkte Kompilierung keine Option. Daher werden Entwickler die gängige x86-Architektur als Host nutzen und Toolchains spezifisch für die Zielhardware verwenden, um Binärdateien zu generieren, die mit der Zielhardware kompatibel sind.
In diesem Artikel wird eine Fallstudie behandelt, in der die Cross-Kompilierung eines Open-Source-Pakets für PowerPC durchgeführt wurde. Der Artikel wird die Details der verwendeten Tools und Toolchains sowie eine schrittweise Anleitung dazu behandeln, wie die Cross-Kompilierung für diese Architektur erreicht wurde.
TDas Problemstatement
Gegeben ist eine Zielplatine mit PowerPC-Architektur, mit dem Ziel, L3-Routingfähigkeiten zu dieser Platine hinzuzufügen. Zu diesem Zweck wurde ein beliebtes Open-Source-Routingprotokollpaket, FRRouting (FRR), in Betracht gezogen.
FRR ist ein Protokoll-Suite, die es jeder Linux-Maschine ermöglicht, sich wie ein vollwertiger Router zu verhalten. Es ist für amd64, arm64, armhf, und i386 verpackt, jedoch nicht für PowerPC. Dies erforderte die Cross-Kompilierung von FRR.
Build host | target host | |
---|---|---|
CPU-Architektur |
x86_64 |
Powerpc(32-Bit) |
Betriebssystem |
Ubuntu 18.4 |
QorIQ SDK |
CPU |
12 |
2 (e5500) |
RAM |
12GB |
1GB |
Tabelle 1. Unterschied in Build- und Zielplattform
Die Cross-Compilations-Reise
Es gibt zwei Hauptphasen im Cross-Compiling:
Konfigurieren der Buildumgebung und des vorkompilierten Toolchains
1. Installieren Sie die erforderlichen Build-Tools in der Umgebung. Zu den gängigen Build-Tools gehören autoconf, make, cmake, build-essentials, pkg-config, libtool usw.
2. Richten Sie den vorkompilierten Toolchain spezifisch für die Ziel-Host-Umgebung ein. CPU/Board-Hersteller stellen ihre eigenen architekturspezifischen Toolchains bereit. Der auf das Zielboard zugeschnittene Toolchain wurde von der Website des Herstellers bezogen.
3. Der Toolchain wird mit einer Umgebungsdatei geliefert, die zum Setzen der Umgebungsvariablen wie CC, GCC, PKG_CONFIG_PATH usw. verwendet wird, die für das Cross-Compiling benötigt werden. Bearbeiten Sie die Umgebungsdatei /opt/fsl-qoriq/2.0/environment-setup-ppce5500-fsl-linux
und aktualisieren Sie den Pfad der Variablen entsprechend dem Pfad des Toolchain-Verzeichnisses.
export SDKTARGETSYSROOT=/opt/fsl-qoriq/2.0/sysroots/ppce5500-fsl-linux
export PATH=/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/../x86_64-fslsdk-linux/bin:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux-uclibc:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux-musl:$PATH
export CCACHE_PATH=/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/../x86_64-fslsdk-linux/bin:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux-uclibc:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux-musl:$CCACHE_PATH
export PKG_CONFIG_SYSROOT_DIR=$SDKTARGETSYSROOT
export PKG_CONFIG_PATH=$SDKTARGETSYSROOT/usr/lib/pkgconfig
export CONFIG_SITE=/opt/fsl-qoriq/2.0/site-config-ppce5500-fsl-linux
export PYTHONHOME=/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr unset command_not_found_handle
export CC="powerpc-fsl-linux-gcc -m32 -mhard-float -mcpu=e5500 --sysroot=$SDKTARGETSYSROOT"
export CXX="powerpc-fsl-linux-g++ -m32 -mhard-float -mcpu=e5500 --sysroot=$SDKTARGETSYSROOT"
export CPP="powerpc-fsl-linux-gcc -E -m32 -mhard-float -mcpu=e5500 --sysroot=$SDKTARGETSYSROOT"
export AS="powerpc-fsl-linux-as "
export LD="powerpc-fsl-linux-ld --sysroot=$SDKTARGETSYSROOT"
export GDB=powerpc-fsl-linux-gdb
export STRIP=powerpc-fsl-linux-strip
export RANLIB=powerpc-fsl-linux-ranlib
export OBJCOPY=powerpc-fsl-linux-objcopy
export OBJDUMP=powerpc-fsl-linux-objdump
export AR=powerpc-fsl-linux-ar
export NM=powerpc-fsl-linux-nm
export M4=m4
export TARGET_PREFIX=powerpc-fsl-linux-
export CONFIGURE_FLAGS="--target=powerpc-fsl-linux --host=powerpc-fsl-linux --build=x86_64-linux --with-libtool-sysroot=$SDKTARGETSYSROOT"
export CFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types"
export CXXFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types"
export LDFLAGS="-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed"
export CPPFLAGS=""
export KCFLAGS="--sysroot=$SDKTARGETSYSROOT"
export OECORE_DISTRO_VERSION="2.0"
export OECORE_SDK_VERSION="2.0"
export ARCH=powerpc
export CROSS_COMPILE=powerpc-fsl-linux-
Auflösen von Abhängigkeiten in einer vorcompilierten Toolchain
Jede Software hat ihre eigenen Abhängigkeiten (Tools/Bibliotheken), die vor der Kreuzkompilierung gelöst werden müssen.
Je nach Verfügbarkeit der Pakete dieser Tools/Bibliotheken in der Zielarchitektur gibt es zwei Optionen, um sie zu lösen. Entweder sie direkt aus den verfügbaren Paketen installieren oder sie ebenfalls aus dem Quellcode kreuzkompilieren.
Speziell für die FRR-Kompilierung müssen die Bibliotheken libpcre2, libyang, clippy, libelf und json-c aus dem Quellcode erstellt werden. Abgesehen davon waren die Pakete der Bibliotheken protobuf und libcap für die PPC (PowerPC) Architektur verfügbar, die direkt in die Toolchain installiert werden können.
1. Installation von Bibliotheken aus Paketen
Bibliothekspakete, die für die Zielarchitektur verfügbar sind, können auf zwei Arten in das Toolchain-Sysroot installiert werden:
- Die erste Methode verwendet das auf Ubuntu/Debian basierende
dpkg-deb
-Tool zum direkten Installieren von Debian-Paketen, wie unten angegeben:Shell$ dpkg-deb -x <pkg_name>.deb <toolchain_directory_path>
#Beispiel von libcap:
$ wget http://launchpadlibrarian.net/222364908/libcap-dev_2.24-12_powerpc.deb
$ dpkg-deb -x libcap-dev_2.24-12_powerpc.deb /opt/fsl-qoriq/2.0/sysroots/ppce5500-fsl-linux/
Hinweis:
- Laden Sie alle Abhängigkeitspakete herunter und installieren Sie sie in der richtigen Reihenfolge.
- Bibliothekspakete können in eine andere Verzeichnisstruktur installiert werden. Kopieren Sie diese Bibliotheksdateien in die entsprechenden Verzeichnisse gemäß der Toolchain.
- Auf die zweite Weise werden debian/rpm-Pakete extrahiert und manuell in das Toolchain-Verzeichnis wie unten angegeben platziert:
- Zum Extrahieren des debian-Pakets verwenden Sie die Tools
ar
undtar
wie unten angegeben:Klartext$ ar -x <package>.deb
$ tar -xJf data.tar.xz
Hinweis: Diese Methode ist nützlich für Systeme ohne Unterstützung für
dpkg-deb
. - Für die Extraktion von rpm-Paketen verwenden Sie das Tool
rpm2cpio
mit dem folgenden Befehl:Klartext$ rpm2cpio <package>.rpm | cpio -idmv
-
Beispiel für die Paketextraktion und Dateiplatzierung mit libcap:
Shell# Extrahieren Sie das .deb-Paket
$ ar -x libcap-dev_2.24-12_powerpc.deb
# Drei Dateien werden extrahiert (control.tar.gz, data.tar.xz, debian-binary)
$ ls
control.tar.gz data.tar.xz debian-binary libcap-dev_2.24-12_powerpc.deb
# data.tar.xz enthält die Programmdateien des Pakets
# control.tar.gz enthält Metadaten des Pakets
# debian-binary enthält die Version des deb-Dateiformats
# Entpacken Sie data.tar.xz, um die Programmdateien des Pakets zu extrahieren.
$ tar -xJf data.tar.xz
# HINWEIS: rpm2cpio <package>.rpm extrahiert direkt die Programmdateien.
# Machen Sie das Gleiche für alle abhängigen debian- oder rpm-Pakete im gleichen Pfad, dies extrahiert alle erforderlichen Programmdateien und Symlinks in derselben Verzeichnisstruktur.
# Die extrahierten Dateien unter den Verzeichnissen usr/lib, usr/include und usr/bin sollten in das Verzeichnis /usr des toolchain_directory_path kopiert werden, neben den bereits vorhandenen Dateien.
$ cp usr/include/sys/capability.h /opt/fsl-qoriq/2.0/sysroots/ppce5500-fsl-linux/usr/include/sys/
-
Um zu überprüfen, ob die Pakete/Bibliotheken erfolgreich installiert wurden, führen Sie den folgenden Befehl aus:
Shell# Stellen Sie sicher, dass Sie die PKG_CONFIG_PATH-Variable aus der Umgebungsdatei der Toolchain exportieren
$ pkg-config --list-all | grep <package_library_name>
Hinweis: Installieren Sie
pkg-config
, falls noch nicht installiert.
- Zum Extrahieren des debian-Pakets verwenden Sie die Tools
2. Cross-Compiling Bibliotheken
Bibliothekspakete sind nicht für die Zielarchitektur verfügbar und werden aus dem Quellcode kompiliert. Bevor Sie mit der Kompilierung beginnen, laden Sie die Umgebungsdatei, die mit dem Toolchain verpackt ist, um alle erforderlichen Parameter für die Cross-Kompilierung zu setzen.
$ source <env_file_path>
Befolgen Sie die in der README-Datei der Bibliothek angegebenen Kompilationsschritte. Setzen Sie zusätzlich die untenstehenden Parameter in den Schritten des Bauprozesses:
- Setzen Sie den
--host-Parameter
beim Ausführen des./configure
-Skripts.Shell$ ./configure --host=<target_host_parameter>
# Beispiel:
$ ./configure --host=powerpc-fsl-linux
Hinweis:
- <target_host_parameter> ist das System, für das die Bibliothek/das Tool erstellt wird. Es kann in der Umgebungsdatei des Toolchains gefunden werden. Es handelt sich um ein gemeinsames Präfix, das in $CC, $LD usw. gefunden wird.
- Es wird zwei Arten von abhängigen Bibliotheken geben. Eine wird nur für den Kompilierungsprozess benötigt, die andere ist eine Abhängigkeitsanforderung für die Ausführung am Zielhost. Legen Sie den
--host-Parameter
entsprechend fest.
- Bei der Verwendung von „make install“ zum Erstellen abhängiger Bibliotheken, setzen Sie DESTDIR auf das Verzeichnis des Toolchain-Systemroots.
Shell
$ make DESTDIR=<toolchain_directory_path> install
Beispiel:
$ make DESTDIR=/opt/fsl-qoriq/2.0/sysroots/ppce5500-fsl-linux/ install
Fazit
Die Unterschiede in den Systemarchitekturen, Bibliotheken, Abhängigkeiten und Toolchains machen die Kreuzkompilierung zu einer komplexen Technik. Um die Komplexität zu verringern, deckt dieser Artikel die Phasen der Kreuzkompilierung auf. FRR und PowerPC wurden als Beispiele für die gewünschte Software und die Zielhardware herangezogen. Die in diesem Artikel behandelten Schritte bieten jedoch eine angemessene Strategie für die Kreuzkompilierung jeder Software auf einer bestimmten Hardware. Die Umgebungsparameter, die Toolchain und die Abhängigkeiten variieren je nach den Anforderungen.
Source:
https://dzone.com/articles/heterogeneity-computing-environments-cross-compilation