OpenWrt – Cross-Compilation

Je m’intéresse à écrire un programme de démonstration « Hello world ! » en langage C et à en vérifier l’exécution dans un routeur opérant sous OpenWrt. Les difficultés de l’exercice résident dans la compilation du programme et la liaison avec les librairies OpenWrt car ces opérations ne sont pas réalisables dans le routeur. Elles doivent être réalisées dans un autre ordinateur et le code généré doit être transféré dans le routeur. On parle de Cross-Compilation.
Dans l’article précédent OpenWrt – TP-Link TL-WR710N, j’avais documenté comment installer OpenWrt dans le routeur TP-Link TL-WR710N. Cet article s’appuie sur le même modèle.

Cross-Compilation avec réalisation de package

OpenWrt offre plusieurs distributions (2014-09-02):

Au moment de la rédaction de l’article précédent OpenWrt – TP-Link TL-WR710N, la distribution la plus récente était attitude_adjustement v12.09. Comme elle ne supportait pas le modèle TL-WR710N, je m’étais rabattu sur la suite snapshots. A ce jour (2024-09-02) OpenWrt prépare la nouvelle distribution barrier_breaker v14.07 RC3 et elle supporte le routeur TL-WR710N. Toutefois je préfère poursuivre l’exercice avec la suite snapshots et le type de processeur ar71xx que je connais mieux.
OpenWrt – Download: Index of /snapshots/trunk/ar71xx/

La préparation d’image OpenWrt et la cross-compilation de la distribution snapshots s’effectue obligatoirement dans un PC Linux 64bits. Pour mon cas, j’ai installé une distribution Debian amd64 dans une machine VirtualBox sous Windows 8.1.

L’étape suivante est de télécharger le OpenWrt-SDK correspondant à notre modèle de routeur.

L’archive OpenWrt-SDK sert à créer des packages OpenWrt. Il y a plusieurs didacticiels dont OpenWrt – Using the SDK ou encore le tutoriel OpenWRT c,c++ programing.

J’ai suivi ce dernier tutoriel et cela n’a pas été sans peines! Il manquait plusieurs paquets à ma distribution Linux Debian amd64 pour effectuer la compilation dont git et svn. Pour couronner le tout, il est interdit de compiler en root ou alors on peut taper la commande magique:

Cross-Compilation sans réalisation de package

Le programme Hello World! qui sera testé dans le routeur:

L’archive toolchain à télécharger et à extraire:

Dans mon exemple, l’emplacement des fichiers extraits est dans le dossier des téléchargements:

Naviguez ensuite dans le le dossier toolchain:

Créez un dossier src et déposez le fichier à compiler helloworld.c. Les programmes de compilation sont dans le dossier bin.

Pour compiler le programme, tapez la ligne de commande:

Si la compilation est sans erreur, alors le programme helloworld se trouve dans le dossier src.
En fait, il se produira 3x le même warning lors de la compilation:

Pour annuler les warnings STAGING_DIR, il suffit de déclarer la variable d’environnement avec un contenu vide:

Ensuite on copie le programme compilé dans le routeur avec la commande scp:

Puis à l’aide d’une console sur le routeur, tapez la commande helloworld:

CQFD.