Introducción
Teniendo acceso a un dispositivo con sistema operativo GNU/Linux y arquitectura MIPS como un router o un sistema embebido será necesario generar archivos binarios ejecutables con herramientas como la suite busybox completa o la herramienta tcpdump para interceptar paquetes de red. Estos sistemas suelen carecer de estas herramientas o se incluyen con características reducidas. Para ello es necesario instalar un compilador cruzado y el código fuente de la aplicación, que dependiendo de las versiones utilizas, puede desembocar en errores.
Buildroot es una herramienta que con una sencilla interfaz nos permite mediante una interfaz gráfica seleccionar la opciones y las herramientas a compilar para luego generar los archivos binarios. Buildroot se encarga de todo el proceso.
Instalación
Para instalar Buildroot, descargamos su última versión y la extraemos.
$ wget https://www.buildroot.org/downloads/buildroot-2024.02.6.tar.gz
$ tar xvzf buildroot-2024.02.6.tar.gz
$ cd buildroot-2024.02.6
Configuración
Para invocar su interfaz gráfica y realizar la configuración utilizamos la herramienta make. Si no la tenemos instalada será necesario instalar el paquete build-essential en el caso de un sistema operativo GNU/Linux basado en Debian.
$ make menuconfig
Nos aparecerá la configuración Buildroot 2024.02.6 Configuration. En primer lugar entraremos en el menú Target options. En Target Architecture seleccionaremos MIPS (big endian) o MIPS (little endian). Para saber que opción marcar podemos utilizar el comando file sobre un binario extraído del sistema.
$ file busybox
busybox: ELF 32-bit MSB executable, MIPS, MIPS32 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, no section header
Observamos que es un binario de 32 bits por lo que es MIPS en vez de MIPS64. Es MSB por lo que seleccionamos big endian. Si fuera LSB seleccionaremos little endian. También observamos que está enlazado dinámicamente y que su biblioteca intérprete es /lib/ld-uClibc.so.0. Tras seleccionar MIPS (little endian) volvemos al menú principal.
A continuación entramos en el menú Toolchain. De forma predeterminada, la opción C library está configurada como glibc. Observamos anteriormente que la biblioteca interprete es uClibc por lo que la cambiamos a la opción uClibc-ng. Volvemos al menu principal y entramos en Build options. Como la biblioteca uClibc-ng con la que se va a compilar el binario es diferente a la contenida en el binario cambiamos a que el binario esté enlazado estáticamente en la opción libraries a static only.
Volviendo al menú principal podemos seleccionar las herramientas a generar en el menú Target packages. Busybox se genera de forma predeterminada. Encontramos Tcpdump en el menú Networking applications > tcpdump (NEW).
Compilación
Finalmente podemos generar el archivo de configuración .config seleccionando la opción Save. Ya podemos iniciar la compilación con el comando make.
$ make -j16
Tras unos minutos, se generan el sistema de archivos con binarios en la subcarpeta output/target/bin.
$ file output/target/bin/busybox
output/target/bin/busybox: ELF 32-bit MSB executable, MIPS, MIPS32 version 1 (SYSV), statically linked, stripped
Conclusión
Con el uso de Buildroot y tras una sencilla configuración, es posible generar archivos binarios para cualquier arquitectura soportada, en el caso de que un sistema operativo de un dispositivo embebido no incluya herramientas específicas.