Aggiornato al : lug 5, 2007

L’architettura della CPU Broadcom del Linksys WRT54G è MIPS per cui, visto che la stragrande
maggioranza di personal computer adottano architettura x86, per compilare un binario oppure l’intera immagine del firmware è necessario utilizzare un cross-compiler
Un cross-compiler è un compilatore che lavora su un architettura e produce i binari per un’altra. Nel caso specifico il cross-compiler Broadcom lavora su architettura x86 per produrre binari MIPS
Per toolchain si intende quel gruppo di strumenti che permettono di compilare per un’altra architettura e di creare le immagini appropriate.
La prima fase è crearsi un ambiente di lavoro: per fare ciò sono necessari:I toolchain (SDK) presenti nel sito ufficiale (http://openwrt.org) a questo indirizzo.
Una volta scompattato, tutto la cartella va copiata in /opt.
Successivamente è necessario aggiungere al PATH il percorso relativo ai binari dei compilatori. Portandosi all’interno di /opt/brcm/hndtools-mipsel-linux/bin il comando da eseguire sarà:

# export PATH=“$PATH:$PWD”

Stesso discorso per la directory /opt/brcm/hndtools-mipsel-uclibc/bin

Una volta scelta la versione di firmware da ricompilare bisogna andare nella sottodirectory tools del

firmware e copiare tutti i files presenti all’interno della sottodirectory /bin. Questa operazione va

eseguita soltanto la prima volta che si effettua una compilazione.

Esempio
:

Supponiamo di essere l’utente mikele e di voler creare un piccolo programma che verrà compilato sul nostro computer ma eseguito sul router:

Vediamo come compilare un file.c qualunque per l’architettura MIPS e successivamente come trasferirlo sul router:

//hello.c

int main()
{
printf(“Hello worldn”);
return 0;
}


Una volta salvato, la cross-compilazione del file avviene col comando:

$ /home/mikele/OpenWrt-SDK-Linux-i686-1/staging_dir_mipsel/bin/mipsel-linux-gcc -I/home/mikele/OpenWrt-SDK-Linux-i686-1/staging_dir_mipsel/usr/include/ -o hello.o -c hello.c

Se invece nel nostro programma facciamo uso di librerie come ad esempio la libpcap dobbiamo “lincarla” con il seguente comando:


/home/mikele/OpenWrt-SDK-Linux-i686-1/staging_dir_mipsel/bin/mipsel-linux-gcc -I/home/mikele/OpenWrt-SDK-Linux-i686-1/staging_dir_mipsel/usr/include/ -o selene hello.o /home/mikele/OpenWrt-SDK-Linux-i686-1/staging_dir_mipsel/usr/lib/libpcap.a

Adesso è possibile copiare il binario ottenuto (hello) sul router.
Per copiare, utilizziamo il comando scp dalla shell ssh:

$scp hello root@192.168.1.1:/tmp

Il passo finale consiste nell’aprire una shell (SSH) nel router ed eseguire il programma copiato con il seguente comando.
./hello

Related Posts:


Leggi Anche




  • peppely Says:
    gennaio 5th, 2012 at 18:49

    Ciao ,
    anke se è trascorso molto tempo spero che tu mi possa dare ugualmente una mano.
    Ho un pc con ubuntu 10.04 e un WRT54GL linksys e dovrei compilare un programma in c che usa le libpcap ho scaricato la buildroot con il toolchain al suo interno così :
    svn co svn://svn.openwrt.org/openwrt/branches/backfire

    ho seguito la guida del sito openwrt :

    http://wiki.openwrt.org/doc/howto/buildroot.exigence

    alla fine do il comando :

    /home/pippo/backfire/staging_dir/toolchain-mipsel…./usr/bin/mipsel-uclibc-gcc mio_programma.c -o mio_programma /home/pippo/backfire/staging_di/target-mipsel…./usr/lib/libpcap.a

    me lo compila , lo vado a mettere sul linksys e mi da l’errore :

    segmentation fault

    anche se faccio il semplice hello.c , me lo compila e sul linksys mi da :

    segmentation fault

    help me , dove sbaglio ?

    Rispondi