• 20 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 23/12/2019

Utilisez la chaîne de cross-compilation officielle de Debian

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Debian et les chaînes de compilation croisée officielles

Debian fournit une chaîne de compilation croisée "officielle" qui peut être installée directement avec la commande apt-get. La documentation est disponible ici : https://wiki.debian.org/CrossToolchains. Cette chaîne peut être  utilisée pour compiler des applications pour systèmes embarqués utilisant Debian comme système d'exploitation. Il est déconseillé d'utiliser cette chaîne pour d'autres distributions comme Raspbian ou Buildroot (que vous utiliserez dans la suite de ce cours), à cause des dépendances de librairies spécifiques à Debian. 

 Afin de ne pas "polluer" votre système, il est préférable d'installer cette chaîne dans un environnement chroot

Voici la liste des principales architectures officiellement supportées par Debian :

  • arm64 : architecture ARM, processeur 64 bits (Raspberry PI 3...) ;

  • armel :  ancienne architecture ARM, processeur 32 bits (ancien NAS...) ;

  • armhf :  nouvelle architecture ARM (version > 7), processeur 32 bits (Raspberry PI 2...) ;

  • mips : architecture MIPS grand boudiste (SGI...) ;

  • mipsel : architecture MIPS petit boudiste (Loongson-3...) ;

  • powerpc : architecture PPC  32 bits (Apple de 1994 à 2006...) ;

  • ppc64el : architecture PPC 64bit (Motorola G5...) ;

  • ...

Préparez votre système

Commençons par mettre en place un environnement chroot Debian (distribution Stretch) dans  notre environnement de travail. Pour cela, installez le paquet Debootstrap, puis utilisez la commande du même nom afin d'installer une nouvelle Debian minimale (version Stretch) dans le dossier stretch-crossdev.

cd ~/Development-tools

sudo apt-get install debootstrap
sudo debootstrap stretch stretch-crossdev

Vous pouvez maintenant vous "enfermer" dans votre nouvelle Debian (se chrooter). 

sudo chroot stretch-crossdev
ls

Dans ce nouvel environnement, vous pouvez facilement lister les chaînes de compilation croisée en recherchant les différentes versions de GCC disponibles.

apt-cache search '^gcc-' | grep architecture

Vous obtenez ainsi la liste suivante des paquetages installables dans votre environnement via la commande apt-get.

Chaînes de compilation croisée officielles
Chaînes de compilation croisée officielles

Installez une chaîne pour ARM 32 bits

Vous pouvez désormais installer des chaînes de compilation croisée dans votre environnement chroot. Pour installer une nouvelle chaîne, commencez par ajouter l'architecture correspondante avec la commande dpkg, puis installez la version de GCC correspondante.

Commencez par installer une chaîne pour une architecture ARM 32 bits. Pour cela, ajoutez l'architecture armhf. Vous devez ensuite mettre à jour la liste des paquetages disponibles ; cela permettra de prendre en compte les paquetages disponibles pour cette architecture.

dpkg --add-architecture armhf
apt-get update

Continuez avec l'installation de la version de GCC correspondant à cette architecture.

apt-get install gcc-arm-linux-gnueabihf

Nous allons maintenant tester cette chaîne avec notre exemple de code, le fameux "Bonjour le monde". Pour cela, il faut tout d'abord sortir de l'environnement chroot.

exit

Copiez ensuite l'exemple que vous avez créé dans la partie précédente dans le dossier /root/ de votre environnement chroot (i.e. dans le dossier stretch-crossdev/root/).

sudo cp ~/Development-tools/examples/hello.c stretch-crossdev/root/

Entrez ensuite à nouveau dans votre environnement chroot via la commande :

sudo chroot stretch-crossdev

Vérifiez que le fichier hello.c est bien présent dans le dossier /root/.

cd /root/
ls

 Compilez maintenant ce fichier avec la commande arm-linux-gnueabihf-GCC, afin de générer l'exécutable hello-arm32.

arm-linux-gnueabihf-gcc -Wall -o hello-arm32 hello.c

Récupérez maintenant les informations de l'exécutable généré à l'aide de la commande file. Comme vous travaillez dans un nouvel environnement Debian, vous devez tout d'abord installer cette commande.

apt-get install file

Puis récupérez les informations.

file hello-arm32

Comme dans le chapitre précédent, il s'agit d'un exécutable pour plateforme ARM 32 bits. Les principales différences par rapport à la version générée avec la chaîne de compilation croisée fournies pour Raspberry PI sont : 

  • shared object au lieu d'executable ;

  • la version de l'ABI (3.2.0 au lieu de 2.6.32) ;

  • l'exécutable contient une empreinte d'intégrité.

Analyse du fichier hello-arm32
Analyse du fichier hello-arm32

Vous pouvez finalement quitter votre environnement.

exit

Installez une chaîne pour ARM 64 bits

La version 3 de la Rapsberry PI dispose d'un processeur ARM 64 bits. Afin de générer un exécutable 64 bits, vous pouvez installer la chaîne de compilation croisée compatible avec cette architecture.

Pour ajouter cette nouvelle chaîne, entrez tout d'abord dans votre environnement.

sudo chroot stretch-crossdev

Puis ajoutez l'architecture arm64 et mettez à jour la liste des paquetages disponibles.

dpkg --add-architecture arm64
apt-get update

Installez la version de GCC disponible pour cette architecture et compatible avec la Raspberry PI 3.

apt-get install gcc-aarch64-linux-gnu

Compilez l'exemple avec cette nouvelle chaîne de compilation croisée afin de générer un exécutable 64 bits.

aarch64-linux-gnu-gcc -Wall -o hello-arm64 hello.c

Récupérez finalement les informations de l'exécutable obtenu.

file hello-arm64

L'exécutable que vous venez de générer est donc bien un exécutable 64 bits pour architecture ARM 64 bits (aarch64). Notez que cet exécutable nécessite au minimum l'ABI 3.7.0.

Analyse du fichier hello-arm64
Analyse du fichier hello-arm64

Commandes complémentaires

 Vous pouvez lister les différentes architectures que vous avez ajoutées a votre environnement à l'aide de la commande dpkg.

dpkg --print-foreign-architectures

Dans notre cas, nous avons deux architectures, armhf et aarch64.

Liste des architectures installées
Liste des architectures installées

À partir de Debian 9, vous pouvez installer un environnement de développement complet pour certaines architectures, et pas seulement le compilateur GCC comme vous venez de le faire. Vous aurez ainsi aussi accès aux principaux compilateurs, tel que g++, et aux principales bibliothèques, telles que la librairie SSL libssl

Pour lister les environnements disponibles, listez les paquetages contenant le mot crossbuild.

apt-cache search crossbuild

Vous obtenez ainsi la liste suivante, qui correspond aux principales architectures supportées :

Environnements complets disponibles
Environnements complets disponibles

Pour installer un environnement complet, par exemple pour ARM 64 bits, il suffit d'installer le paquetage correspondant.

apt-get install crossbuild-essential-arm64

Vous pouvez finalement quitter votre environnement.

exit
Exemple de certificat de réussite
Exemple de certificat de réussite