Pouvoir compiler pour une autre architecture que la sienne ou comment faire de la compilation croisée
La compilation croisée ou «cross-compilation» en anglais permet de créer des exécutables depuis une certaine architecture pour une autre (Linux 32bits / 64bits mais aussi windows…). Cela permet de créer des paquets pour des systèmes que nous n'avons pas sous la main !
Pour cela, nous allons commencer par compiler… un compilateur ! Mais attention, il sera BRUT c'est-à-dire sans aucune bibliothèque. On pourra alors compiler le kernel Linux ou une bibliothèque.
Exceptions : le compilateur pour Windows® existe en paquets, pas besoin de le re-compiler, installez le paquet mingw32. Pour linux 32 bits vers 64 et vice-versa, il existe aussi des paquets : lib64(32)gcc1 et libc6-dev-amd64(i386). Il suffit de les installer pour aboutir à l'équivalent de ce que nous allons faire ici à la main.
Pour la compilation croisée vers une architecture arm un petit script vous est présenté dans l'article Compilation croisée pour ARM
Prérequis
Avoir jeté un oeil sur la page traitant de la compilation standard : compilation.
Si vous vouler compiler pour Windows® ou pour un 32/64 bits croisé, rendez-vous à la rubrique utilisation…
Avoir téléchargé les sources de binutils et gcc. Prendre la dernière version ne devrait pas faire de mal.
Compilation du compilateur
Le compilateur comporte deux parties : les binutils et gcc. On commence avec les binutils qui comportent les outils de gestion comme ld ou ar.
Les binutils
Décompresser l'archive téléchargée précédemment et aller dans le dossier créé.
configuration
Configurer la compilation avec la commande :
./configure --target=x86_64-pc-linux
L'option "target" permet de choisir l'architecture de destination. Ici on aura un compilateur pour l'architecture 64 bits. Remplacer le x86_64 par ce que l'on souhaite produire.
On peut utiliser l'option "prefix" pour configurer le dossier de base de l'installation mais étant donné que les exécutables créés seront tous précédés de l'architecture voulue, on peut tranquillement les mettre avec les autres sinon il faudrait configurer le PATH pour savoir où les chercher.
compilation
Il suffit de lancer la commande :
make all
installation
Avec les droits super-utilisateur si on veut installer dans les parties système (option "prefix") :
make install
gcc : "GNU Compiler Collection", groupement de compilateurs GNU
Décompresser l'archive téléchargée précédemment et aller dans le dossier créé.
configuration
Configurer la compilation avec la commande :
./configure --enable-languages=c --disable-threads --disable-shared --disable-checking --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --target=x86_64-pc-linux
L'option "target" permet de choisir l'architecture de destination. Ici on aura un compilateur pour l'architecture 64 bits. Remplacer le x86_64 par ce que l'on souhaite produire.
Si on veut le C++, il faut le rajouter aux langages, après c : –enable-languages=c,c++
compilation
Il suffit de lancer la commande :
make all-gcc
installation
Avec les droits super-utilisateur si on veut installer dans les parties système (option "prefix") :
make install-gcc
Voila, on devrait avoir un compilateur en état de marche…
Utilisation
Donner la variable d'environnement "CC=xxxxxx" où xxxxxx est le préfixe des commandes de compilateur que make devra utiliser. C'est ce qu'on a donné comme target plus haut.
Pour les paquets installés Linux 32/64 croisé il faut rajouter l'argument "-m64(32)" à la ligne de gcc. De plus certaines bibliothèques existent en paquets, voir tous les paquets "lib64(32)*".
Le kernel
Exemple de ligne de commande pour compiler le kernel Linux où c'est plus compliqué si on veut utiliser make-kpkg :
sudo make-kpkg --initrd --arch=amd64 --cross_compile=x86_64-pc-linux --revision=amd64noyaujojo --append-to-version test kernel_image kernel_headers modules_image
En super-utilisateur pour créer le paquet (!). Ici on donne à arch la valeur "amd64" car ne compte que ce que les paquets acceptent comme architecture, non pas le préfixe des commandes à utiliser. On a pour cela recours à l'option "cross-compile" qui remplace l'habituelle "–arch".
Les autres options sont issues de la page traitant de la compilation du kernel.
Astuces
Rajouter l'option "-j X" à make pour compiler sur plusieurs processus à la fois par ex. pour un bicore : "-j 4". X = (nombre de cores)x2
Ressources
Contributeurs: Créée par Johndescs.