Compilación Cruzada para MIPS

Jul 18, 2011 2 Comments by

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
Sistemas Embebidos

About the author

Ingeniero en Informática, Oracle Certified Master Java EE 6 Enterprise Architect, Oracle Certified Professional Java Programmer. Experto en distintas ramas de la computación y otras "yerbas" xD. Si te gusto este post, sígueme en @deerme_org, escríbeme a info AT deerme.org o contactame por linkedin.

2 Responses to “Compilación Cruzada para MIPS”

  1. angel says:

    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.

  2. Compilando cruzadamente para Router Modem ADSL dual bhs amper ASL-26555_CL says:

    [...] las instrucciones para generar un entorno de desarrollo con buildroot para MIPS, solo hay que modificar la arquitectura, a MIPS little endian [...]

Leave a Reply


two - 1 =