Petit mémento à l'usage des Linuxiens férus d'embarqué :
Nous allons détailler la conception d'une chaine de compilation croisée "From Scratch".
Le but de cette page web est de comprendre la méthode de conception d'une chaine d'un point de vue pédagogique.
Il existe des moyens beaucoup plus simples pour obtenir une chaines de compilation croisée avec notament les projets:
Crosstool-ng, Buildroot, Openembedded et j'en passe...
Paramètres | Fonction |
--disable-werror | Désactivation des "warning" : évite de bloquer la compilation. |
--build=$BUILDMACH | Architecture du PC hôte qui fait la compilation. |
--prefix=$INSTALLDIR | Répertoire d'accueil des exécutables. |
--with-sysroot=$SYSROOTDIR | Répertoire d'accueil des libraires. |
--target=$TARGETMACH | Architecture cible. |
Paramètres | Fonction |
--without-headers | Compilation sans les en-têtes du noyau compilateur |
--enable-bootstrap | GCC produit sous forme de "BootStrap" |
--enable-languages=c | Seul le langage C est nécessaire (le C++ est possible) |
--disable-threads | Désactivation des fichiers d'inclusion multi-thread |
--enable-__cxa_atexit | Option décrivant l'implémentation de la fonction atexit() |
--disable-libmudflap | bibliothèque utilisée pour le débogage |
--with-gnu-ld | Compilation avec linker natif |
--with-gnu-as | Compilation avec assembleur natif |
--disable-libssp | Désactivation de la bibliothèque spécialisée dans le dépassement mémoire |
--disable-libgomp | Désactivation de l'API OpenMP |
--disable-nls | Désactivation de tous les langages locauxd sauf l'anglais |
--disable-shared | Le compilateur ne supportera pas les bibliothèques dynamiques |
Paramètres | Fonction |
--prefix=$SYSROOTDIR/usr | Répertoire d'accueil des exécutables |
--with-headers=$SYSROOTDIR/usr/include | Utilisation des en-têtes du noyau de l'étape 4.6.4 |
--config-cache | Force l'exécutable configure à lire |
les instructions du fichier config.cache | |
--enable-add-ons=glibc-ports-2.9,nptl | Utilisation de la bibliothèque supplémentaire glibc-ports |
pour ARM (notre cas). Egalement valable pour MIPS et | |
PowerPC. | |
--enable-kernel=2.6.0 | Conception de la bibliothèque pour noyau Linux type 2.6.0. |
Commandes | Explications |
echo "libc_cv_forced_unwind=yes" > config.cache | Le fichier config.cache |
echo "libc_cv_c_cleanup=yes" >> config.cache | contient ces 2 lignes |
qui empêchent l'exécution | |
du code compilé | |
pour ARM avec la chaîne de | |
compilation croisée installée | |
sur le host (x86) | |
make -k install-headers cross_compiling=yes | Les fichiers d'entêtes sont |
install_root=$SYSROOTDIR | cross-compilés et |
installés dans le répertoire | |
$SYSROOTDIR | |
ln -s /opt/arm/lib/gcc/arm-none-linux-gnueabi/4.3.3/libgcc.a | Même chose ici: par ce lien |
/opt/arm/lib/gcc/arm-none-linux-gnueabi/4.3.3/libgcc_eh.a | symbolique, nous forçons |
la conception de la | |
bibliothèque de la | |
chaîne de compilation | |
en statique |
Commandes | Explications |
export CC=gcc | La variable d'environnement oblige la |
compilation du GCC pour ARM par le compilateur du host | |
--disable-multilib | Les différentes variantes de bibliothèques |
pour architectures différentes ne sont pas conçues | |
--with-float=soft | Support des nombres à virgule flottante |
émulé par le soft car les ARM n'ont pas de FPU (Floating Point Unit) | |
--disable-sjlj-exceptions | Exceptions spécifiques au C++, il |
convient de les désactiver vu que notre chaîne ne supporte que le C | |
--enable-threads=posix | Les threads sont au format POSIX |
--enable-long-longx | En C, support des entiers longs |
Exécutable | Fonction |
arm-none-linux-gnueabi-addr2line | Convertit les adresses en numéro de ligne dans le fichier originel. |
arm-none-linux-gnueabi-ar | Crée et manipule le contenu des archives. |
arm-none-linux-gnueabi-as | GNU assembleur. |
arm-none-linux-gnueabi-c++filt | Décode les symboles du C++ et du Java. |
arm-none-linux-gnueabi-cpp | Préprocesseur C++. |
arm-none-linux-gnueabi-gcc | Compilateur GNU C. |
arm-none-linux-gnueabi-gcc-4.3.3 | Compilateur GNU C en version 4.3.3 comme le précédent. |
arm-none-linux-gnueabi-gccbug | Report de bogue GCC. |
arm-none-linux-gnueabi-gcov | Donne le taux de couverture d'un test dans un programme. |
arm-none-linux-gnueabi-gprof | Fait du profilage de code source. |
arm-none-linux-gnueabi-ld | GNU Linker. |
arm-none-linux-gnueabi-nm | Liste les symboles des fichiers objets. |
arm-none-linux-gnueabi-objcopy | Copie et traduit les fichiers objets. |
arm-none-linux-gnueabi-objdump | Affiche les informations du contenu des fichiers objets. |
arm-none-linux-gnueabi-ranlib | Génère un index du contenu d'une archive. |
arm-none-linux-gnueabi-readelf | Affiche les informations d'un fichier au format ELF. |
arm-none-linux-gnueabi-size | Liste les tailles des sections d'un fichier objet. |
arm-none-linux-gnueabi-strings | Affiche les chaînes de caractères imprimables d'un fichier objet. |
arm-none-linux-gnueabi-strip | Supprime tous les symboles contenus dans les fichiers objets. |