La cross-compilation avec GCC

GEDsismik

Autres

Systèmes

Qu'est-ce que la cross-compilation ?

La cross-compilation, c'est la compilation sur un ordinateur d'un programme pour un ordinateur d'une autre famille de processeur ou ayant un autre OS. Exemple : compiler sous GNU/Linux des binaires pour NetBSD ou compiler sous x86 des binaires pour SPARC.

Se créer un environnement

Tout d'abord, vous devez avoir un compilateur. Jusqu'ici, rien de surprenant. Pour notre exemple, nous prendrons gcc sous GNU/Linux. Mais se compilateur doit être compiler de telle manière qu'il compile pour l'ordinateur voulu (relisez eventuellement la phrase, j'admet, à première vue, elle fait peur). Donc, nous allons recompiler GCC ainsi que bintuils (vérifiez avant si votre distribution propose des paquetages déjà fait pour l'occasion, ca sera plus propre). Oui, parce qu'il faut un binutils de cross-compilation pour pouvoir compiler et utiliser un GCC de cross-compilation. Non, arrêtez de crier, ca sert à rien, c'est pas si terrible.

Note pour les slackistes : J'ai fait des paquetages pour la cross-compilation de GNU/Linux x86 vers Microsoft Windows x86. Ils sont disponibles ici : binutils-crosswin-2.15.92.0.2-i686-ssk.tgz, mingw32-3.9-i686-ssk.tgz et gcc-crosswin-3.4.5-i686-ssk.tgz.

Où installer

Tout d'abord, choisissez un endroit où vous voulez installer GCC et binutils. En effet, pour éviter toute perturbation (écrasement ?) des actuels GCC et binutils de votre système, nous allons les installer dans un autre répertoire. Personnellement, j'ai choisis /usr/crosscompil. Vous pouvez très bien choisir un répertoire de votre home (comme /home/bob/crosscompilation) si vous avez trop peur ou que vous n'avez pas les droits root. Pour éviter de vous perdre, mettez le chemin dans une variable d'environnement (export CHEMIN=/usr/crosscompil). Attention ! Ne mettez pas de chemin relatif mais le chemin absolu (à partir de la racine). Voilà ! Dans la suite, ce répertoire sera appellé $CHEMIN (oui, vous avez le droit de remplacer tous les $CHEMIN par /home/bob/crosscompilation mais ça fait simplement plus à taper et je suis paresseux ;) ).

Il va sans dire que le répertoire doit exister. Dans le cas contraire, créez-le.

Récupérer mingw (optionnel)

Dans le cas où vous voulez faire des binaires pour Microsoft Windows, vous aurez besoin de mingw (exemple que j'ai pris). Mingw est une bibliothèque qui permet, entre autre, de gérer l'API win32 (bibliothèque graphique pour Windows).

On trouve mingw sur http://www.mingw.org. Personnellement, j'ai pris les deux fichiers de binaires mingw-runtime-3.9.tar.gz et w32api-3.6.tar.gz que j'ai décompressé dans /usr/crosscompil.

Compiler binutils

Les sources de binutils sont sur ftp://ftp.gnu.org/gnu/binutils.

Récupérez les sources de binutils (j'ai pris binutils-2.15.92.0.2), décompressez les !

$ tar -jxvf binutils-2.15.92.0.2.tar.bz2
$ cd binutils-2.15.92.0.2
Ensuite, compiler comme il s'en suit :
$ export PATH=$CHEMIN/bin:$PATH
$ ./configure --prefix=$CHEMIN \
        --target=i686-pc-mingw32 
$ make
Dans le cas où vous installez dans un répertoire demandant les droits root, passez en root maintenant.
# make install

Compiler GCC

Pour GCC, c'est beaucoup plus compliqué.. non, j'rigole ! C'est pareil

Les sources de GCC sont sur ftp://ftp.gnu.org/gnu/gcc.

Récupérez les sources de gcc (j'ai pris gcc-3.4.5.tar.bz2), décompressez les !

$ tar -jxvf gcc-3.4.5.tar.bz2
$ cd gcc-3.4.5
Ensuite, compiler comme il s'en suit :
$ export PATH=$CHEMIN/bin:$PATH
$ ./configure --prefix=$CHEMIN \
        --target=i686-pc-mingw32
$ make
Dans le cas où vous installez dans un répertoire demandant les droits root, passez en root maintenant.
# make install

Utiliser l'environnement

Programme test

Faisons un programme test vite-fait :

$ echo "int main() { printf(\"Hello World\"); }" > test.c
$ gcc -o test test.c
$ file test
test: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV) [...]

Ca, ca veut dire que ca a été compilé pour un unix (jusqu'ici tout va bien).

Testons l'environnement :

$ export PATH=$CHEMIN/bin:$PATH
$ i686-pc-mingw32-gcc -o test.exe test.c
$ file test.exe 
test.exe: PE executable for MS Windows (console) Intel 80386 32-bit

Elle est pas belle la vie ? ;)

Bien sur, un test de l'executable généré ne peut se faire qu'avec un Microsoft Windows ou un émulateur :

$ wine test.exe 
Hello World

Programme-test graphique

Tapez le code suivant dans un fichier nommé testgraph.c (ou le nom que vous voulez).
#include <windows.h>

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
  MessageBox(NULL,
    "Cette fenêtre prouve que le cross-compilateur est fonctionnel !",
    "Hello World", MB_OK);
  return 0;
}

Hop là ! On compile :

$ export PATH=$CHEMIN/bin:$PATH
$ i686-pc-mingw32-gcc -o testgraph.exe testgraph.c 
$ file testgraph.exe 
testgraph.exe: PE executable for MS Windows (console) Intel 80386 32-bit

Et le moment magique, c'est quand meme wine testgraph.exe.

Cross-compilation win32

Makefile et compagnie

Maintenant, comment compiler un programme dépassant les 5 lignes de code ? Ben.. c'est simple (ou presque). Il suffit de passer au configure un paramètre --host. Exemple avec make :

Les sources de make sont sur ftp://ftp.gnu.org/gnu/make.

$ tar -jxvf make-3.81.tar.bz2
$ cd make-3.81
$ export PATH=$CHEMIN/bin:$PATH
$ ./configure --host=i686-pc-mingw32
[...]
$ make
[...]
$ file make.exe 
make.exe: PE executable for MS Windows (console) Intel 80386 32-bit

Note : C'est pas aussi simple pour tous les logiciels. Notamment à cause de problème de dépendance (exemple : compiler gaim sans un gtk cross-compilé aussi).

Le site : Le Livre D'Or
Autres : - Développement - Droit - Graphisme - Mes Applications - Réseau et sécurité -
Systèmes : - Généralités sur les systèmes - BeOS - BSD - GNU/Linux - IBM AIX - MS-DOS / Microsoft Windows -
Par : GEDsismik
Dernière mise à jour :
- du site : 14/09/2006
- de la page : 04/11/2008
Site hébergé par Free.
Document issu de http://gedsismik.free.fr/darkdoc/article.php?id=47.
Les informations contenues dans cette page ne sont aucunement garanties.
Toute critique constructive ou correctif est la bienvenue.
Contactez le webmaster
  Linux
 Valid HTML 4.01!  Powered by DarkDoc