Cross compiler son propre code en C pour GLInet

De knowledge
Aller à la navigation Aller à la recherche

Lorsque nous avons voulu installer un mécanisme de test de la bande passante on a installé un cross compilateur pour OpenWRT sur une machine Windows WSL (ca marche probablement sur n'importe quel Linux).

L'installation est faite dans :

$HOME/source/openwrt-sdk-18.06.1-ar71xx-generic_gcc-7.3.0_musl.Linux-x86_64

On fait un petit set-env.sh :

export ROUTER_IP=192.168.8.1
export STAGING_DIR=$HOME/source/openwrt-sdk-18.06.1-ar71xx-generic_gcc-7.3.0_musl.Linux-x86_64/staging_dir
export TOOLCHAIN=$STAGING_DIR/toolchain-mips_24kc_gcc-7.3.0_musl
export CROSS=$TOOLCHAIN/bin/mips-openwrt-linux

On lance la conf avec :

source set-env.sh

On crée un répertoire sources dans notre environnement de cross compilation

mkdir sources
cd sources

On y mets notre hello.c:

// hello.c
#include <stdio.h>
int main(void) {
    puts("Hello from GL-AR150 (mips_24kc)!");
    return 0;
}

On le compile:

$CROSS-gcc -Os -s -fPIC -o hello hello.c

C'est instantané (vive le C!) et on retrouve un binaire hello:

file hello

Qui nous donne:

hello: ELF 32-bit MSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-mips-sf.so.1, stripped

On le copie sur le routeur:

scp hello root@${ROUTER_IP}:.
ssh root@${ROUTER_IP}

Et là on peut le lancer:

BusyBox v1.28.3 () built-in shell (ash)

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 OpenWrt 18.06.1, r7258-5eb055306f
 -----------------------------------------------------
root@GL-AR150:~# ./hello
Hello from GL-AR150 (mips_24kc)!
root@GL-AR150:~#

C'est-t-y pas chouette?