Avec l’avènement des logiciels open source et l’acceptation de ces solutions pour créer des systèmes complexes, la capacité de développer des applications pouvant fonctionner de manière transparente sur plusieurs plateformes matérielles devient intrinsèquement importante. Il y a un besoin constant de développer le software sur une architecture mais d’avoir la capacité de les exécuter sur d’autres architectures cibles. Une technique courante pour y parvenir est la compilation croisée de l’application pour l’architecture cible.
Cross-compilation est significatif dans les systèmes embarqués où l’intention est d’exécuter des applications sur du matériel spécialisé comme les cartes ARM et PowerPC. Ces systèmes sont contraints en ressources et donc une compilation directe n’est pas une option. Ainsi, les développeurs tireront parti de l’architecture x86 commune comme hôte et utiliseront des chaînes d’outils spécifiques au matériel cible, générant des binaires compatibles avec le matériel cible.
Cet article couvre une telle étude de cas où la cross-compilation d’un paquet open-source a été réalisée pour PowerPC. L’article couvrira les détails des outils et des chaînes d’outils utilisés et un tutoriel étape par étape sur la manière dont la cross-compilation a été réalisée pour cette architecture.
Le problème
Étant donné une carte cible avec une architecture PowerPC, l’objectif était d’ajouter des capacités de routage L3 à cette carte. Dans ce but, un ensemble de protocoles de routage open-source populaire, FRRouting (FRR), a été envisagé.
FRR est un ensemble de protocoles qui permet à toute machine Linux de se comporter comme un routeur complet. Il est disponible pour amd64, arm64, armhf, et i386 mais pas pour PowerPC. Cela a nécessité la compilation croisée de FRR.
Build host | target host | |
---|---|---|
Architecture CPU |
x86_64 |
Powerpc(32 bits) |
Système d’exploitation |
Ubuntu 18.4 |
QorIQ SDK |
CPU |
12 |
2 (e5500) |
RAM |
12 Go |
1 Go |
Table 1. Différence entre la construction et la plateforme cible
The Voyage de la Cross-Compilation
Il y a deux étapes majeures dans la compilation croisée :
Configurer l’environnement de construction et la chaîne d’outils précompilée
1. Installez les outils de construction requis dans l’environnement. Les outils de construction courants incluent autoconf, make, cmake, build-essentials, pkg-config, libtool, etc.
2. Configurez la chaîne d’outils précompilée spécifique à l’environnement hôte cible. Les fournisseurs de CPU/Carte fournissent leurs propres chaînes d’outils spécifiques à l’architecture. La chaîne d’outils spécifique à la carte cible a été obtenue à partir du site Web du produit du fournisseur.
3. La chaîne d’outils est fournie avec un fichier d’environnement, qui est utilisé pour définir les variables d’environnement comme CC, GCC, PKG_CONFIG_PATH, etc., nécessaires à la compilation croisée. Modifiez le fichier d’environnement /opt/fsl-qoriq/2.0/environment-setup-ppce5500-fsl-linux
et mettez à jour le chemin des variables par rapport au chemin du répertoire de la chaîne d’outils.
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-
Résolution des Dépendances dans la Chaîne d’Outils Précompilée
Chaque logiciel a son propre ensemble de dépendances (outils/bibliothèques), qui doivent être résolues avant la cross-compilation.
Selon la disponibilité des paquets de ces outils/bibliothèques dans l’architecture cible, il y a deux options pour les résoudre. Soit les installer directement à partir des paquets disponibles, soit les cross-compiler également à partir de la source.
Spécifiquement pour la compilation de FRR, les bibliothèques libpcre2, libyang, clippy, libelf et json-c doivent être construites à partir de la source. En dehors de cela, les paquets de bibliothèques protobuf et libcap étaient disponibles pour l’architecture PPC (PowerPC), qui peuvent être installés directement dans la chaîne d’outils.
1. Installation des Bibliothèques à Partir des Paquets
Les paquets de bibliothèques disponibles pour l’architecture cible peuvent être installés dans le sysroot de la chaîne d’outils de deux manières :
- La première méthode utilise l’outil
dpkg-deb
basé sur Ubuntu/Debian pour installer directement les packages Debian comme mentionné ci-dessous :Shell$ dpkg-deb -x <nom_du_pkg>.deb <chemin_du_répertoire_de_l'ensemble_d'outils>
#Exemple de 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/
Remarque:
- Téléchargez tous les packages de dépendances et installez-les dans l’ordre.
- Les packages de bibliothèques peuvent être installés dans une structure de répertoire différente. Copiez ces fichiers de bibliothèques vers les répertoires corrects selon l’ensemble d’outils.
- Deuxièmement, les paquets Debian/RPM sont extraits et placés manuellement dans le chemin du répertoire de la chaîne d’outils comme mentionné ci-dessous:
Pour extraire le paquet Debian, utilisez les outilsar
ettar
comme mentionné ci-dessous:$ ar -x <package>.deb
$ tar -xJf data.tar.xz
Note: Cette méthode est utile pour les systèmes sans support
dpkg-deb
.$ rpm2cpio <package>.rpm | cpio -idmv
Exemple d’extraction de package et de placement de fichier avec libcap:
# Extract .deb package
$ ar -x libcap-dev_2.24-12_powerpc.deb
# Three files will be extracted (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 has the package’s program files
# control.tar.gz has metadata of package
# debian-binary has version of deb file format
# Untar data.tar.xz to extract the package’s program files.
$ tar -xJf data.tar.xz
# NOTE: rpm2cpio <package>.rpm will directly extract program files.
# Do the same for all dependent debian or rpm packages at the same path, this will extract all program files and symlinks required in same directory structure.
# Extracted files under usr/lib, usr/include and usr/bin directories should be copied to toolchain_directory_path’s /usr directory, alongside the existing files already present.
$ cp usr/include/sys/capability.h /opt/fsl-qoriq/2.0/sysroots/ppce5500-fsl-linux/usr/include/sys/
Pour vérifier si les paquets/bibliothèques ont été installés avec succès, exécutez la commande ci-dessous:
# Make sure to export PKG_CONFIG_PATH variable from toolchain’s env file
$ pkg-config --list-all | grep <package_library_name>
Note: Installez
pkg-config
si ce n’est pas déjà fait.
2. Compilation croisée des bibliothèques
Les packages des bibliothèques ne sont pas disponibles pour l’architecture cible et sont compilés à partir de la source. Avant de commencer la compilation, chargez le fichier d’environnement fourni avec le kit d’outils pour définir tous les paramètres nécessaires à la compilation croisée.
$ source <env_file_path>
Suivez les étapes de compilation indiquées dans le fichier README de la bibliothèque. De plus, définissez les paramètres ci-dessous dans les étapes de la procédure de construction :
- Définissez le paramètre
--host
lors de l’exécution du script./configure
Shell$ ./configure --host=<paramètre_hôte_cible>
# Exemple :
$ ./configure --host=powerpc-fsl-linux
Remarque :
- <paramètre_hôte_cible> est le système pour lequel la bibliothèque/l’outil est en cours de construction. Il peut être trouvé dans le fichier d’environnement de la chaîne d’outils. C’est un préfixe commun trouvé dans $CC, $LD, etc.
- Il y aura deux types de bibliothèques dépendantes. L’une est uniquement requise pour le processus de compilation, et l’autre est une exigence de dépendance pour l’exécution sur l’hôte cible. Définissez le paramètre
--host
en conséquence.
- Lors de l’utilisation de « make install » pour construire des bibliothèques dépendantes, définissez DESTDIR sur le répertoire sysroot de l’outil de chaîne.
Shell
$ make DESTDIR=<chemin_du_répertoire_toolchain> install
Exemple :
$ make DESTDIR=/opt/fsl-qoriq/2.0/sysroots/ppce5500-fsl-linux/ install
Conclusion
Les différences dans les architectures système, les bibliothèques, les dépendances et les chaînes d’outils rendent la cross-compilation une technique complexe à exécuter. Pour simplifier ces complexités, cet article dévoile les phases de la cross-compilation. FRR et PowerPC ont été pris comme exemples pour le logiciel souhaité et le matériel cible, respectivement. Cependant, les étapes couvertes dans cet article fournissent une stratégie raisonnable pour la cross-compilation de tout logiciel sur un matériel spécifique. Les paramètres de l’environnement, la chaîne d’outils et les dépendances varieront en fonction des exigences.
Source:
https://dzone.com/articles/heterogeneity-computing-environments-cross-compilation