Heterogenität von Computing-Umgebungen mittels Cross-Kompilierung

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 1Unterschied 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.

Shell

 

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:

  1. Die erste Methode verwendet das auf Ubuntu/Debian basierende dpkg-deb-Tool zum direkten Installieren von Debian-Paketen, wie unten angegeben: 
    Shell

     

    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.
  2. Auf die zweite Weise werden debian/rpm-Pakete extrahiert und manuell in das Toolchain-Verzeichnis wie unten angegeben platziert:
    1. Zum Extrahieren des debian-Pakets verwenden Sie die Tools ar und tar wie unten angegeben:
      Klartext

       

      Hinweis: Diese Methode ist nützlich für Systeme ohne Unterstützung für dpkg-deb.

    2. Für die Extraktion von rpm-Paketen verwenden Sie das Tool rpm2cpio mit dem folgenden Befehl:
      Klartext

       

    3. Beispiel für die Paketextraktion und Dateiplatzierung mit libcap:

      Shell

       

    4. Um zu überprüfen, ob die Pakete/Bibliotheken erfolgreich installiert wurden, führen Sie den folgenden Befehl aus:

      Shell

       

      Hinweis: Installieren Sie pkg-config, falls noch nicht installiert.

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.

Shell

 

Befolgen Sie die in der README-Datei der Bibliothek angegebenen Kompilationsschritte. Setzen Sie zusätzlich die untenstehenden Parameter in den Schritten des Bauprozesses:

  1. Setzen Sie den --host-Parameter beim Ausführen des ./configure-Skripts.
    Shell

    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.
  2. Bei der Verwendung von „make install“ zum Erstellen abhängiger Bibliotheken, setzen Sie DESTDIR auf das Verzeichnis des Toolchain-Systemroots.
    Shell

     

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