Hacklab La Paz "r00thouse"

Portada del sitio > Curiosidades > "Hola Mundo": compilación cruzada para router TL-MR3020 libre-cmc/openwrt

"Hola Mundo": compilación cruzada para router TL-MR3020 libre-cmc/openwrt

Domingo 19 de junio de 2016, por strysg

En este artículo se mostrará una forma muy básica de hacer un programa que se ejecute en el router TL-MR3020 escrito por nosotros, este ejemplo se ha probado con librecmc pero debería funcionar también para openwrt.

¿Para qué sirve esto?

Si no es para el caso obvio de querer jugar haciendo un "Hola Mundo" que se ejecute en nuestro router, tenemos que aprender a hacer compilación curzada para esta arquitectura.

Por que no escribir el programa en el mismo router

En pocas palabras el router TL-MR3020 no tiene la cantidad suficiente de memoria como para almacenar el toolchain , entonces podemos tener el compilador en nuestra PC o laptop y ejecutarlo para generar programas que puedan ejecutarse en el TL-MR3020.

Lo que haremos será usar nuestra PC o laptop (el husped) para generar un archivo que pueda ejecutarse en el TL-MR3020 que ya tiene instalado el S.O. librecmc, es decir haremos compilación cruzada.

Otro ejemplo de compilación cruzada es cuando hacemos programas para arduino.

Lo que se necesita

Necesitamos tener el toolchain de librecmc o de openwrt.

Básicamente para esto necesitamos seguir una de estas guías: buildroot para librecmc, buildroot para openwrt.

Estos pasos requieren descargar mucho, alrededor de 2 a 7 GB, pero es indispensable tener el toolchain o no podremos hacer el "Hola Mundo" ni ningún otro programa. Además si tenemos el buildroot podremos compilar modificaciones de librecmc u openwrt en nuestra computadora y tener como resultado un nuevo S.O. para ponerlo en un router específico :).

Puede tomar tiempo dominar esto, para hacer nuestro "hola mundo" podemos resumir en:

  • Descargar las dependencias.
  • Ejecutar make menuconfig , seleccionar la arquitectura. (para el TL-MR3020 es AR7xxx/AR9xxx)
  • Asegurarse de que el toolchain esté marcado y salir con doble esc.
  • Asegurarse de que en Target Profile esté marcado TP-LINK TL-MR3020.
  • Ejecutar make. (esto tomará mucho tiempo y dependiendo lo seleccionado descargará mucho)

Esto construirá el toolchain y también una imagen de firmware para el TL-MR3020, nos centraremos en el toolchain para hacer el "hola mundo".

Preparando las cosas para la compilación cruzada

Para comprobrar que el toolchain se haya generado , en la carpeta raíz (donde ejecutamos make) debería existir una carpeta llamada staging_dir, además debería contener el toolchain , en mi caso es:

staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2

Verificamos que dentro de toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin se encuentra un archivo ejecutable con nombre parecido a
mips-librecmc-linux-uclibc-gcc-4.8.3

Crearemos una variable de entorno en la terminal para no tener que escribir el nombre cuando querramos llamar a este compilador. Por comodiad podemos posicionar la terminal en ese directorio primero, luego creamos la variable:

CCM=$PWD/mips-librecmc-linux-uclibc-gcc-4.8.3

Para confirmar que todo va bién y que se puede ejecutar el compilador itentemos ahora en la terminal:

$CCM -v

Si esto nos muestra por ejemplo al final algo parecido a:

gcc version 4.8.3 (libreCMC/Linaro GCC 4.8-2014.04 unknown)

Significa que todo va como debería.

Escribiendo y construyendo el Hola Mundo

En nuestro editor favorito escribiremos el programa hola.c , cuyo contenido es:

#include <stdio.h>

int main(void)
{
  printf("Hola Mundo...");
  return 0;
}

Guardamos el archivo, y desde la consola donde creamos la variable CCM, lo podemos compilar de manera básica con:

$CCM -o hola hola.c

Es posible que se generen errores como:

mips-librecmc-linux-uclibc-gcc-4.8.3: warning: environment variable 'STAGING_DIR' not defined
mips-librecmc-linux-uclibc-gcc-4.8.3: warning: environment variable 'STAGING_DIR' not defined

Pero lo importante es ver que se haya generado un ejecutable llamado hola , y para comprobar que es un archivo que se puede ejecutar en el TL-MR3020 podemos usar file:

file hola

Que debería devolver algo como:

hola: ELF 32-bit MSB  executable, MIPS, MIPS32 rel2 version 1, dynamically linked (uses shared libs), not stripped

Listo ya hemos hecho el "hola mundo" correctamente, ahora a probarlo en el router.

Ejecutarlo en el router

Para este sencillo paso copiaremos el archivo "hola" al router por ejemplo con:

scp root@ip.del.router.aqui:/root/

Luego abrimos una consola con ssh root@ip.del.router.aqui , y ejecutamos hola

./hola

Esto debería mostrar en la pantalla.

Hola Mundo...

Lo hemos logrado : )

Ir más lejos

Para que no salga ese error en la compilación y si quieres por ejemplo compilar otros programas más grandes esta es una guía más completa.

https://wiki.openwrt.org/doc/devel/crosscompile

Espero les sirva.