Compilación Cruzada para MIPS
Actualmente tengo DD-WRT (firmware basado en GNU/Linux) en mi Router TP-Link TL-WR941ND, funciona muy bien, la interfaz es muy cute y amigable, disponemos de acceso SSH o Telnet y un gran etc. Un punto muy destacable, es la posibilidad de levantar interfaces wlan virtuales para manajar otras redes o incluso configurar nuestro router como “Access Point” para compartir el enlace de una red WIFI en mi lan/wlan interna.
He hecho un pequeño upgrade, reemplazando las antenas originales de 4dbi por 2.4GHz 11dBi SMA Omnidirectional WiFi Antenna de dealextreme (a 5.94 USD cada una xD, eso si, hay que recalcar que no son de 11dBi, si no, de ~8dBi aproximadamente).
Una de las carácteristicas más favorable al usar DD-WRT (o otro firmware basado en GNU/Linux como OpenWRT, etc.) es disponer de un Sistema Operativo GNU/Linux real que podemos extender y jugar con el, siempre dentro de los límite de nuestro hardware.
TL-WR941ND v3 tiene un procesador MIPS AR9132 de 400 Mhz, una memoria flash de 4Mb y 32Mb de ram.
Preparación de un entorno de desarrollo con Buildroot
Vamos a preparar un entorno de desarrollo con Buildroot que nos permitirá crear nuestro toolchains para compilar cruzadamente desde x86 hacía mips (la arquitectura del router).
#Host x86 #Procedemos a crear nuestro directorio de trabajo y descargar buildroot cd /opt mkdir toolchains-mips cd toolchains-mips wget "http://buildroot.uclibc.org/downloads/buildroot-2011.05.tar.gz" tar zxvf buildroot-2011.05.tar.gz cd buildroot-2011.05
Un paso muy importante para preparar nuestro entorno, es determinar bien la arquitectura, por lo tanto debemos mirar los parametros básicos del router mirando la CPU, analizar algún binario ya compilado, etc.
# Router cat /proc/cpuinfo #system type : Atheros AR9132 rev 2 (0xb9) #processor : 0 #cpu model : MIPS 24Kc V7.4 #BogoMIPS : 266.24 #CPUClock : 400 #wait instruction : yes #microsecond timers : yes #tlb_entries : 16 #extra interrupt vector : yes #hardware watchpoint : yes, count: 4, address/irw mask: [0x0ff8, 0x0ffc, 0x0ffb, 0x0ffb] #ASEs implemented : mips16 #shadow register sets : 1 #core : 0 #VCED exceptions : not available #VCEI exceptions : not available file /bin/sh # ELF 32-bit MSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked (uses shared libs)
Debemos tomar nota sobre la arquitectura para configurar correctamente el entorno, en mi caso (WR941ND) la configuración de buildroot es la siguiente.
Target Architecture (mips)
Target Architecture Variant (mips 32r2)
Target ABI (o32)
make menuconfig
Configuramos nuestra arquitectura y guardamos la configuración, por lo tanto ahora procedemos a compilar nuestro entorno.
make
Una vez finalizado el proceso, buildroot ha descargado y compilado varias utilidades. Creando un entorno de desarollo para la arquitectura del router (mips 32r2).
Debemos configurar un par de variables de entorno necesarias para la correcta compilación (las rutas hay que adaptarlas).
export TOOLCHAIN_MIPS=/opt/toolchains-mips/buildroot-2011.05 export PATH=$TOOLCHAIN_MIPS/output/host/usr/bin:$PATH export AR=$TOOLCHAIN_MIPS/output/host/usr/bin/mips-linux-ar export AS=$TOOLCHAIN_MIPS/output/host/usr/bin/mips-linux-as export CC=$TOOLCHAIN_MIPS/output/host/usr/bin/mips-linux-gcc export CPP=$TOOLCHAIN_MIPS/output/host/usr/bin/mips-linux-cpp export CXX=$TOOLCHAIN_MIPS/output/host/usr/bin/mips-linux-g++ export LD=$TOOLCHAIN_MIPS/output/host/usr/bin/mips-linux-ld export GCC=$TOOLCHAIN_MIPS/output/host/usr/bin/mips-linux-gcc export NM=$TOOLCHAIN_MIPS/output/host/usr/bin/mips-linux-nm
Podemos crear un pequeño helloworld en C como el siguiente
#include <stdio.h> main() { int i; for(i=0;i<100;i++) printf("Hi Router!!\n"); }
Y lo podemos comilar cruzadamente desde nuestra plataforma host (x86) a MIPS, a través del binario mips-linux-gcc, además vamos a agregar el flag static para crear un binario estático.
mips-linux-gcc /tmp/helloworld.c -static -s -o /tmp/helloworld-mips
Solo nos queda enviar nuestro ejecutable helloworld-mips a nuestro router
scp /tmp/helloworld-mips root@192.168.1.1:/tmp
Finalmente podemos probar nuestro binario en el router, creamos una sessión ssh hacía nuestro router y damos permiso de ejecución al binario.
ssh -l root 192.168.1.1 cd /tmp chmod +x hellowolrd-mips ./helloworld-mips
Un gran trabajo. muchas gracias. he seguido tu manual y salvo algún paquete que he tenido que bajar, baison y demás, y actualizar el buildroot a la versión actual a ido perfecto.
ahora me queda ver como compilar proyectos mas grandes como mldonkey o similares a mips.
[...] las instrucciones para generar un entorno de desarrollo con buildroot para MIPS, solo hay que modificar la arquitectura, a MIPS little endian [...]