Journal WRT54G : cross-compiler firmware et applications

Posté par  .
Étiquettes : aucune
0
21
juin
2004
Bon, ceci est un brouillon d'un véritable article/howto que je ferai un jour, et qui lorsqu'il sera finalisé sera probablement en Licence Art Libre, mais de toute façon sous licence libre. En attendant, ça m'arrangerait que personne ne le recopie, donc je laisse le droit d'auteur s'appliquer (y compris aux traductions), et blah blah blah...

Vous êtes l'heureux possesseur d'un Linksys WRT54G, ce routeur bien fait, plein de possibilités et qui tourne sous GNU/Linux. Malheureusement voilà, vous trouvez qu'il lui manque une (ou plusieurs) fonctionnalité(s). Vous êtes loin d'être le seul, plus on en a, c'est connu, plus on en veut. Vous avez de la chance, le fait que ce routeur utilise un firmware basé sur un noyau linux et une majorité d'outils libres vous ouvre toutes les portes (ou presque, la mémoire contenue dans le routeur étant tout de même limitée). Voilà donc que vous vous demandez comment compiler vous même votre firmware, ou vos applications. Ce petit "tutoriel" est fait pour vous. Je vais vous guider pas-à-pas dans la création d'un toolchain de cross-compilation, et vous expliquer les concepts mis en oeuvre au fur et à mesure.

Qu'est-ce que la cross-compilation ?
Les mots peuvent être trompeurs, la cross compilation n'est pas pratiquée par les chrétiens qui prient pour la réussite de la compilation, équipés de leur crucifix. La locution "cross-compilation" désigne le processus de compiler pour une architecture, tout en se trouvant sur une architecture différente. Ceci s'applique au processeur bien sûr, mais aussi aux APIs utilisées. Par exemple, on peut compiler depuis un système powerpc-linux-unknown-gnu vers un système i686-pc-mingw32-gcc qui désigne donc le fait de compiler un logiciel sur une machine à base de powerpc (par exemple, un macintosh) sous linux avec les outils GNU, mais ce logiciel devra tourner sur un PC avec processeur Intel Pentium II ou équivalent sous Windows. Par définition, le logiciel en question ne pourra donc pas tourner sur le système sur lequel a été effectué la compilation.

Bon, okay, j'ai compris (ou je m'en fous), comment je fais ?
Maintenant, on peut prier ! Il s'agit de compiler, à l'aide du compilateur natif de la machine, un autre compilateur (et les outils associés) qui servira à générer du code pour la machine cible (target). Cet "chaîne" d'outils est appelée toolchain en anglais, et sans elle, point de salut. Sous linux, et avec les outils GNU, une toochain est composée au minimum des binutils (utilitaires permettant d'agir sur le code compilé, par exemple de lier un exécutable à une bibliothèque), de gcc, de la glibc (la bibliothèque C de GNU), et de headers (fichier d'en-tête C) du noyau. Allons-y pour l'exemple, avec le routeur qui nous intéresse. Linksys a utilisé pour compiler son firmware un gcc en pré-version 3.0, une glibc en version 2.2.3, des binutils en version 2.11 et un noyau linux en version 2.4.20. Nous allons donc utilisé des versions le plus proches possible.

Pfff, la théorie, sainul, je veux passer à la pratique...
Ça tombe bien, la théorie, l'auteur de ces lignes n'y comprend pas tout. On va donc passer à la pratique, et pour ça, il faut télécharger l'outil crosstool ( http://kegel.com/crosstool/(...) ), réalisé par Dan Kegel, et qui va considérablement nous simplifier la vie. Une fois le tarball de crosstool 0.27 téléchargé et décompressé, rendez-vous à sa racine. Là, nous allons créer et modifier quelques fichiers.
D'abord, copiez demo-mipsel.sh en wrt54g.sh. Puis éditez-le, et mettez les valeurs suivantes:
"RESULT_TOP" doit être positionné sur "/opt/brcm";
modifiez aussi le "mkdir -p" en accord avec cela;
puis modifiez la ligne débutant par "eval" comme ceci:
"eval `cat wrt54g.dat gcc-3.0-glibc-2.2.3-linux-2.4.20.dat` sh all.sh --notest"
Ensuite, copiez le fichier mipsel.dat vers wrt54g.dat, puis éditez le:
Modifiez "TARGET" pour le mettre à "mipsel-linux".
Enfin, copiez un fichier de versions gcc et glibc, par exemple gcc-3.3-glibc-2.3.2.dat vers dcc-3.0-glibc-2.2.3-linux-2.4.20.dat, puis éditez-le à son tour:
Positionnez "BINUTILS_DIR" à "binutils-2.11", "GCC_DIR" à "gcc-3.0", "LINUX_DIR" à "linux-2.4.20", "GLIBC_DIR" à "glibc-2.2.3" et enfin, "GLIBCTHREADS_FILENAME" à "glibc-linuxthreads-2.2.3".
Il ne reste plus qu'à éditer all.sh, et à changer la définition de "PREFIX" en "/opt/brcm/hndtools-mipsel-linux-3.0" et à créer ce fameux dossier "/opt/brcm" (avec les droits qui vont bien) pour lancer la compilation. Vous êtes prêts ? Tapez sh "wrt54g.sh" dans votre console favorite, et puis finalement, si vous êtes croyants, prenez ce fameux crucifix et priez :-)

La suite dans un prochain épisode, parce que finalement, là, je fatigue...
  • # Remarques et commentaires bienvenus...

    Posté par  . Évalué à 3.

    J'avais prévu de le signaler à la fin, mais comme je suis pas aller jusqu'au bout encore, j'ai oublié... Si j'ai posté ça ici, c'est pour avoir droit à vos commentaire, évidemment :-)
    Donc merci pour toute remarque constructive :-)
    Accessoirement, je m'appreçois que j'oublie de parler du téléchargement des sources fournies par Linksys, de dire que celles-ci ne compilent pas sur les deux machines sur lesquelles j'ai essayé, et de dire que le defconfig fournit avec peut quand être utilisé dans le wrt54g.dat (mais que ça ne change pas grand chose).
    Par contre, on en aura besoin dans la prochaine étape :-)
    • [^] # Re: Remarques et commentaires bienvenus...

      Posté par  . Évalué à 1.

      On me signale dans mon oreillette (je suis un chinois du FBI) qu'il serait bon que j'explique le coup du "/opt/brcm", dont acte:
      Comme dit dans le commentaire précédent, la prochaine étape implique la compilation de différents éléments du tarball fourni par linksys (la uClibc (une bibliothèque C poids léger), et le firmware en lui-même (pour ceusses qui veulent (LISP suxor))). Pour cela, le plus simple est d'utiliser les scripts de compilation tels que fournis par Linksys, or ceux-ci utilisent en dur le chemin "/opt/brcm". En d'autres termes, le choix de ce chemin n'est absoluement pas nécessaire, il suffit de reconfigurer les (rares, je vous rassure) scripts qui l'utilisent. Mais l'utiliser n'est pas bien contraignant, et cela simplifie le tutoriel, donc, hop, je me lâche, et je le fais. Bien fait pour vous.

      --
      Le chinois du FBI masqué (et oreilletté)
  • # sw33t

    Posté par  . Évalué à 2.

    non vraiment bien :)

    je suppose que ça peut s'appliquer au WAP54G qui fait quasiment la meme chose sauf routeur.
    un pti coup de google permet de trouver des docs sur le sujet aussi, mais vas y n'hesite pas.
    ah oui une question : tu le mets sur un site particulier à par ici ?

    une question bete (voir tres bete) : qlq 1 aurait il entendu parler d'un netbsd a la place du nux ? je suis juste curieux et j'ai envie de voir si ca marche ... (google ne me trouve rien d'interessant)
    qui a dit nerd ?
    je suppose que c'est faisable, si linksys a bien mis tout ce qu'il faut en gpl ca devrait pas etre trop dur je pense.
    • [^] # Re: sw33t

      Posté par  . Évalué à 4.

      Tu touches du doit le gros problème de l'affaire... Parce que linksys ne donne pas le code du driver wifi (en fait, broadcom est le vrai coupable, c'est le même chipset que sur les WPC54G ou les airport extreme par exemple) seule la version de linux fournie par linksys tourne dessus... accessoirement, c'est aussi pour ça qu'il faut un toolchain aussi proche que possible du leur: pour pouvoir linker avec les modules binaires fournis. De la même manière, on ne peut compiler le firmware que sur une archi x86, puisque pour générer l'image, il y a besoin de l'un des deux outils créés par linksys à l'occasion, et dont ils ne fournissent pas le code non plus. Je les ai contacté à ce sujet, mais j'ai peu d'espoir.
      Enfin, concernant le WAP54G, tu ne peux que compiler un firmware minimal si j'ai bien tout compris, à cause d'une forte limitation quant à la mémoire disponible...
      • [^] # Re: sw33t

        Posté par  . Évalué à 3.

        mmm...

        s'pa glop tout ca ...

        hum y a t il d'autres AP du meme type qui sont plus ouverts ?
        autrement il y a la solution d'en faire un avec un soekris par exemple mais ca risque d'etre (tres) cher.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.