Skip directly to content

Cross-compiler avec Qemu

Portrait de zozodesbois
on ven, 26/10/2012 - 19:50

Qemu_logo

  1. Le but
  2. Préparation de l'émulation
  3. Amélioration avec distcc
  4. Echange des fichiers entre Ubuntu et Qemu
  5. Accélération
  6. Compiler du C++
Système
Windows Linux Mac
Site officiel http://wiki.qemu.org
Auteur Fabrice Bellard
Licence Gratuit - Open source
Ref http://www.patriotmemory.com
http://landley.net
maemovmware.garage.maemo.org

Le but

Ce Tuto est basé sur celui de Wigout.

Sur Internet nous trouvons énormément de sources de programmes. Certains pourraient être utiles sur nos HMB. Voici un moyen de produire des exécutables pour nos HMB.

Nous pourrions faire un firmware particulier pour créer un environnement de compilation et produire directement les binaires sur notre HMB. Ce n'est pas l'objectif de ce Tuto.

Nous allons faire ici du Cross-compile ou en Français Compilation croisée.
Cela veut dire que nous allons produire sur un Ordinateur les exécutables que nous voulons utiliser sur notre HMB.

Nous allons nous servir de l'émulateur Qemu qui va exécuter un environnement MIPS little indian (MIPSEL). C'est l'architecture de notre HMB.

INFORMATION Bien que Qemu existe en version Windows et Mac, ce Tuto est écrit pour Ubuntu (Linux). Sous Windows vous devriez pouvoir le suivre en installant Sygwin et Qemu (seule la partie accélération risque de ne pas pouvoir être réalisable avec distccd).

Vous pouvez trouver les binaires de Qemu pour Windows http://qemu.weilnetz.de/

Préparation de l'émulation

Sur Ubuntu 12.04 (et plus), installez Qemu

sudo apt-get install qemu-system

Téléchargez les deux fichiers mipsel suivants

system-image-mipsel.tar.bz2

cross-compiler-mipsel.tar.bz2

Ces fichiers proviennent de http://landley.net/code/firmware/downloads/binaries

Désarchivez le system-image-mipsel.tar.bz2 dans un dossier.

tar -xvjf system-image-mipsel.tar.bz2

Positionnez-vous à l'intérieur

cd <mon_dossier>

et lancez le script qui exécute qemu avec l'environnement de compilation Mipsel

./dev-environment.sh

Au premier lancement ce script va créer un fichier image de 2Go pour avoir un espace minimum pour faire des compilations. Il sera automatiquement monté pour chaque lancements de qemu.

ll
-rw-rw-r-- 1 geo geo 2147483648 oct.  26 15:37 hdb.img

Nous sommes maintenant sous Qemu avec l'émulation Mipsel

(mipsel:1) /home #

Nous sommes sur un environnement minimum comme en Telnet, mais avec beaucoup moins de commandes. C'est un shell limité à la compilation.
Pour sortir et revenir sur Ubuntu, tapez exit.

Améliorations

Pour avoir un espace plus grand que 2Go, s'il existe, supprimez le fichier hdb.img et passez la commande suivante en ajustant la valeur en fonction de ce que vous voulez (en méga octets).

export HDBMEGS=4096
./dev-environment.sh

Sur le même principe vous pouvez affecter les variables suivantes

HDB Fichier image pour utiliser -hdb dans /home (si vide, hdb.img est créé)
HDBMEGS Taille en Mo pour créer HDB s'il n'existe pas (si =0, HDB n'est pas créé, par défaut 2048)
HDC Fichier image à monter -hdc sur /mnt (aucun si vide)
QEMU_MEMORY Mémoire en Mo allouée pour Qemu (defaut 256)

Echange des fichiers entre Ubuntu et Qemu

Nous allons créer un dossier sur lequel nous allons monter le /home

mkdir partage
sudo mount hdb.img partage

Vous pouvez maintenant déposer ou récupérer des fichiers depuis Ubuntu que vous retrouverez dans votre /home sous Qemu.

ATTENTION N'utilisez pas le montage en même temps que Qemu, les deux systèmes ont des caches indépendants et vont corrompre le filesystem.

Accélération avec distcc

Système
  Linux  
Site officiel distcc.code.google.com
Auteur communauté
Licence Gratuit - GNU GPL v2
Ref distcc.googlecode.com/doc

A cette étape, notre système de Compilation Croisée et fonctionnelle, vous pouvez vous arrêter là.
Mais cette compilation sur Qemu est très lente. Si nous avons besoin de compiler un très gros source comme Busybox, nous n'avons certainement pas envie d'y passer des heures. Il faudra chercher à ajouter de la puissance pour que cette compilation soit plus rapide.

Distccd est un Service qui permet de partager les ressources. Nous allons nous contenter de l'ajouter sur la partie Ubuntu de notre même machine. Ce qui va permettre de prendre la totalité du potentiel de notre ordinateur en outrepassant l'émulateur. Si vous avez d'autres ordinateurs sur votre réseau local, vous pouvez effectuer la même opération sur vos autres machines. Les Services distccd vont communiquer entre eux et vont regrouper les ressources de l'ensemble de vos machines pour les utiliser pour vos compilations sous Qemu.

Installez le packet distccd

sudo apt-get install distccd

Lancez le Service en fonction des adresses IP que vous avez en local

distccd --daemon --allow 192.168.0.0/24

Décompressez dans un dossier, là ou vous voulez, l'archive du Cross-compiler téléchargée au début du Tuto

tar -xvjf cross-compiler-mipsel.tar.bz2

Ajoutez le chemin du bin dans votre PATH en fonction de là où se trouve votre archive décompressée

export PATH=$PATH:~/Bureau/cross-compiler-mipsel/bin

Compiler du C++

Depuis Qemu, nous allons télécharger un petit source C++ et nous allons le compiler

wget http://dl.dropbox.com/s/h4eni64hrnktzu4/hello.tar.gz

Décompressez l'archive

tar -xvf hello.tar.gz

Mettez-vous dans le dossier du source

cd hello

Nous pouvons enfin lancer la compilation

make

Lorsque c'est fini, vous trouverez le binaire

ls -l hello

Exécutez-le pour voir

./hello

Pour sortir du compilateur

exit

Pour récupérer le binaire que vous avez généré, passez par le montage du /home

Vous n'avez plus qu'à le recopier dans votre HMB et voir s'il marche... smiley
C'est le premier exécutable que j'ai écrit en C++ pour notre HMB !

Votez: 
Pas encore de vote