Cross-Compilazione di programmi e Fw per AGA

 In questo articolo riporto delle informazioni sulla creazione di un proprio firmware, partendo dalla installazione della toolchain fornita da Pirelli per arrivare alla cross-compilazione di sorgenti per il nostro router e infine modificare il fw del router per includere i programmi compilati.

Tutta la documentazione deriva dal forum, da messaggi in PVT, e dal sito sul debrick del router Telecom Alice WGate (OpenWGate).

Indice

  • 1 Toolchain
    • 1.1 Installazione per Linux
      • 1.1.1 Basato su RPM (Red Hat, Mandriva, Fedora, …)
      • 1.1.2 Basato su DEB (Debian, Ubuntu, …)
    • 1.2 Installazione per Windows
  • 2 Cross-Compilazione
    • 2.1 Cross-Compilazione per AGA
  • 3 Creazione FW
    • 3.1 Decomprimere e dividere l’immagine della flash
    • 3.2 Sistemazione del file system
    • 3.3 Creazione del firmware da caricare nel router

1. Toolchain

Per compilare i programmi per AGA è necessaria la toolchain ottenibile dal sito pirellibroadband.

1.1 Installazione per Linux

1.1.1 Basato su RPM (Red Hat, Mandriva, Fedora, …)
# su - 
Password: <-inserire la password di root 
# cd 
# wget http://www.pirellibroadband.com/en_IT/browser/attachments/alice/Alice_AGA_3.2.3_0010_consumer_release.tar.gz 
# tar xzvf Alice_AGA_3.2.3_0010_consumer_release.tar.gz 
# cd Alice_AGA_3.2.3_0010_consumer_release 
# ./consumer_install 
1.1.2 Basato su DEB (Debian, Ubuntu, …)

Eseguire gli stessi per ogni passo RPM-based, poi: Installazione Alien:

# sudo apt-get install alien 

Trasformazione dei pacchetti RPM:

# alien uclibc-crosstools-mips.i386.rpm 
# alien - script uclibc-crosstools-common.i386.rpm

Installazione dei deb trasformati:

# sudo dpkg-i *. deb

In entrambi i casi (RPM e DEB) al termine dell’installazione della toolchain, installare i pacchetti build-essential e libc6-dev per la propria distribuzione (contenenti file header e strumenti per la compilazione di costruire sulla piattaforma:

# sudo apt-get install build-essential libc6-dev

1.2 Installazione per Windows

Se non si dispone di una macchina Linux, è possibile utilizzare il player gratuito di VmWare e una qualunque distribuzione: su google ci sono molte guide.

2. Cross-Compilazione

Per compilare su piattaforma AGA si devono utilizzare correttamente gli strumenti di cross-compilazione. Cross-compilare significa compilare un determinato programma per un architettura differente da quella in cui si sta compilando. Nel nostro caso compileremo da una architettura PC, quindi x86, un programma per un’architettura MIPS. Di conseguenza il binario ottenuto non funzionerà per l’architettura in cui abbiamo compilato (x86) ma girerà correttamente su una architettura MIPS.

All’interno dei sorgenti (Pirelli per esempio) si trova un archivio contenente la toolchain, cioè l’insieme di eseguibili e librerie di base necessari a compilare un eseguibile per MIPS su piattaforma x86. C’è il compilatore gcc e tutti gli altri strumenti della “suite” che servono. Questa toolchain è disponibile anche in pacchetti per alcune distribuzioni (e sopra è stato già descritto come installarli).

Quando si deve cross-compilare un sorgente ci si può trovare davanti a diversi scenari. A volte esiste un “configure” che permette di impostare direttamente gli eseguibili da usare per compilare. Altre volte questo non c’è e ci si arrangia. Quello che succede nei fw broadcom per esempio è che il Makefile imposta delle variabili d’ambiente contenenti i percorsi degli eseguibili della toolchain e usa queste variabili per compilare kernel ed eseguibili.

Un trucco per aumentare lo spazio libero… strippate con strip -g –strip-unneeded tutti i moduli del kernel… e poi guardate il risultato.

2.1 Cross-Compilazione per AGA

Per compilare programmi per il router (cross-compilare), sono necessarie le seguenti variabili di ambiente:

export TARGET_HOST=mips-linux 
export TOOLCHAINS_HOME=/opt/toolchains/uclibc-crosstools 
export LIBS=-L $TOOLCHAINS_HOME/lib/gcc/mips-linux/3.4.2 
export INCLUDES="-I $TOOLCHAINS_HOME/include/c++/3.4.2 -I $TOOLCHAINS_HOME/mips-linux/sys-include" 
export CFLAGS="$INCLUDE $LIBS-static" 
export LDFLAGS=-static 
export CC=$TOOLCHAINS_HOME/bin/mips-uclibc-gcc 
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TOOLCHAINS_HOME/lib 
export PATH=$PATH:$TOOLCHAINS_HOME/bin 

Per i pacchetti già provvisti di validi “configure” è possibile procedere con:

./configure -host=$TARGET_HOST -opzioni_dipendenti_dal_pacchetto_che_si_vuole_compilare 

e poi eseguire

make install

il binario ottenuto funzionerà all’interno del router!

3 Creazione FW

Dopo esser riusciti a compilare il proprio programma per il router e magari averlo pure testato (avendolo caricato nel file system del router via telnet, ftp o quant’altro), sarebbe interessante aggiungerlo nel firmware del router così da averlo sempre a disposizione, anche su riavvio del router.

In sostanza lo scopo è quello di inserire il nostro programma nel file system del router. Si ricorda che il router carica in RAM il file system da una flash e quindi qualsiasi modifica apportata al fs (file system) sarà persa al suo riavvio. Quindi dobbiamo riuscire a modificare il file system nella flash, ovvero ricreare il fw del router.

Quindi si procede prendendo il fw desiderato, lo si decomprime e si ricrea il fs del router all’interno del proprio computer; si modifica il fs aggiungendo il proprio programma precedentemente compilato e infine lo si ri-comprime e si ricrea il fw.

Così, infine, caricando il proprio fw sul router si potrà usufruire del proprio programma!

NB: È possibile trovare la raccolta di utility per eseguire i punti successivi qui.

3.1 Decomprimere e dividere l’immagine della flash

Con l’immagine da caricare in flash (che sia presente o meno il CFE) è possibile utilizzare i bcm_tool (sono da compilare in un normale ambiente linux) per ottenere:

-cfe
-filesystem
-kernel

per fare questo basta:

# ./bcm_fw_extract -a AGA_324_fs_kernel_samba_1.6

così troviamo sulla cartella corrente:

immagine del fs:      rootfs.bin
immagine del kernel:  vmlinux.img

in seguito è possibile decomprimere l’immagine del filesystem utilizzando:

# ./lzma_unsquash -v rootfs.bin

così troveremo nella cartella squashfs-root tutto il filesystem decompresso.

3.2 Sistemazione del file system

A questo punto abbiamo tutto il file system dell’AGA a disposizione. È quindi possibile aggiunger nuovi programmi già compilati e modificare/inserire file di configurazione.

Nel mio caso ho aggiunto il demone p910nd nella cartella /usr/bin e modificato lo script di avvio /etc/drun_script

3.3 Creazione del firmware da caricare nel router

Terminata la sistemazione del fs bisogna ricreare il fw. Quindi si usano i comandi forniti nei sorgenti di Telecom (dopo aver installato tutta la toolchain) nella cartella Alice_router/hostTools.

# ./mksquashfs <percorso>/squashfs-root rootfs.img -noappend -be -lzma -no-fragments -noI

Fate attenzione a correggere il percorso dove avete il fs (<percorso>/squashfs-root). Otterrete in uscita il file rootfs.img con il fs compresso.

In seguito si uniscono le varie parti del fw in un unico file tramite il comando:

# ./bcmImageBuilder --chip 6348 --board "Alice Gate W2+" --blocksize 64 --output firmware.bin --rootfsfile rootfs.img --kernelfile vmlinux.img --cfefile CFE.bin

Dove rootfs.img è l’immagine del file system appena creata, vmlinux.img è l’immagine del kernel che si era ricavata dalla prima divisione del firmware e CFE.bin è l’immagine del CFE che si trova nei sorgenti Telecom nella cartella Alice_router/target/cfe

In uscita si ottiene firmware.bin da caricare (col metodo del ponticello) nel nostro router.

 

Mirco

Web Developer, ciclista, nuotatore, gamer, calciofilo, amante dei motori a due e quattro ruote, troppe passioni per una bio…

Altri articoli - Website

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*