Table des matières

,

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 mingw-w64. 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 à sur la page Comment utiliser MingW[32|64] pour faire des exécutables Windows ?

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.