Compilación-cruzada (cross-compiling) de MIPS para OpenWrt


MIPS-OpenWrt

Si por alguna razón necesitas cross-compilar alguna aplicación para la arquitectura MIPS que correrá en OpenWrt sin usar la herramienta de compilación proporcionada por el proyecto, puedes seguir estos pasos:

  1. Ubica la el toolchain para MIPS de OpenWrt. Desde el directorio donde descargaste OpenWrt ejecuta:
  2. find -name *toolchain-mips*
    ./staging_dir/toolchain-mips_r2_gcc-4.3.3+cs_uClibc-0.9.30.1

    Nota: Se debió haber compilado algo previamente bajo esta arquitectura para poder disponer del toolchain.

  3. Exporta las siguientes variables, teniendo en cuenta la ruta absoluta del toolchain (coloco el ejemplo de mi máquina):
  4. export TOOLCHAIN_PATH=/home/lgallard/backfire/staging_dir/toolchain-mips_r2_gcc-4.3.3+cs_uClibc-0.9.30.1
    export PATH=$PATH:$TOOLCHAIN_PATH/usr/bin/
    export AR=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-ar
    export AS=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-as
    export LD=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-ld
    export NM=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-nm
    export CC=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-gcc
    export CPP=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-cpp
    export GCC=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-gcc
    export CXX=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-g++
    export RANLIB=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-ranlib
  5. Luego para compilar proyectos con Makefile y autotools puedes ejecutar en el directorio de las fuentes de la aplicación:
  6. ./configure --target=mips-openwrt-linux --host=mips-openwrt-linux

Referencia: Cross-compile for WRT


,

  1. #1 by Luis Gallardo on 10/01/2014 - 12:19

    @perrin primero debes aprender a compiar desde las fuentes para OpenWrt. un buen punto de comienzo e la misma página del proyecto http://wiki.openwrt.org/doc/howto/build.

    Una vez que hayas dominado esto, si puedes intentar cross-compilar algo. Solo entonces este articulo tendrá sentido.

    Saludos!

  2. #2 by perrin on 09/01/2014 - 7:13

    perrin :
    No entendi nada, puedes hacer mas basico.

    no se porqué pero no te entiendo.
    Yo lo que yo quiero hacer es compilar aircrack-ng para openwrt.

  3. #3 by Luis Gallardo on 12/12/2013 - 11:01

    @perrin si no estás desarrollando para OpenWrt no necesitas esto. Ahora si quieres compilar algo en C para esta arquitectura, entonces solo sigue los pasos como se comentan en el artículo. Saludos!

  4. #4 by perrin on 12/12/2013 - 9:46

    No entendi nada, puedes hacer mas basico.

  5. #5 by Luis Gallardo on 13/09/2011 - 2:44

    @Sergio de mi experiencia cross-compilando esto puede ser:

    1. No tienes bien las referencias de los headers y librerías. Asegúrate de incluir las rutas para los headers con -I y las librerías con -L, además de indicar que tu programa/librería usa la librería resolv con la opción -lresolv.

    2. Estás usando headers y librerías para otras arquitecturas. Los headers y librerías que encuentras en tu PC sirven para x86, por ende necesitaras las versiones para la arquitectura que desees crsoss-compilar.

    3. Suponiendo que tienes bien las referencias, si estás usando una librería de un tercero, esta debe también estar compilada para la arquitectura a la que quieres cross-compilar. Una opción es conseguir los binarios ya compilados para dicha arquitectura o descargar las fuentes y compilar lo que necesites primero para la arquitectura en cuestión. Por ejemplo, si libUpTools es la librería a enlazar, primero debes cross-compilarla y usar esa como referenica en 1)

    4. Si libUpTools es una librería estándar, debes revisar que el tool-chain de OpenWrt la incluya y que todas las funciones estén implementadas. Para que te des una idea, me pasó que hice un programa que enlazaba a math.h y funcionaba bien en x86 pero para MIPS no funcionaba, y todo porque la función abs() no está implementada en el tool-chain de OpenWrt porque consideraron innecesarias ciertas funciones matemáticas para OpenWrt (hay que recordar que al final es una distro para routers).

    Espero que te sirva de ayuda. Saludos!

  6. #6 by Sergio on 13/09/2011 - 12:41

    Hola Luis, estoy queriendo compilar una librería y unos binarios de ejemplo contra la misma usando la toolchain de OpenWRT y me da error, estos son:

    UpResolverSimple.cc:(.text+0x4dc): undefined reference to `__ns_get16′
    ./.libs/libUpTools.a(UpDnsQuerySimple.o): In function `UpDnsQuerySimple::getFirst() const':
    UpDnsQuerySimple.cc:(.text+0x698): undefined reference to `__ns_parserr’
    ./.libs/libUpTools.a(UpDnsQuerySimple.o): In function `UpDnsQuerySimple::getNext() const':
    UpDnsQuerySimple.cc:(.text+0x794): undefined reference to `__ns_parserr’
    ./.libs/libUpTools.a(UpDnsQuerySimple.o): In function `UpDnsQuerySimple::initialResponseParse()':
    UpDnsQuerySimple.cc:(.text+0xa94): undefined reference to `__ns_initparse’
    ./.libs/libUpTools.a(UpDnsQuerySimple.o): In function `UpDnsQuerySimple::prepare()':
    UpDnsQuerySimple.cc:(.text+0xb38): undefined reference to `__res_mkquery’
    UpDnsQuerySimple.cc:(.text+0xb44): undefined reference to `__ns_get16′

    es como la librería resolv no tiene todos los símbolos… alguna idea?

  7. #7 by Luis Gallardo on 26/07/2011 - 8:14

    @Borja esos mensajes pueden ser porque en el Makefile o .config se puede configurar las herramientas para cross-compilar. En ese caso deberías poner la ruta donde está mips-openwrt-linux-gcc. Si no te resulta, pásame el enlace de lo que quieres compilar para probar. Saludos!

  8. #8 by Borja on 26/07/2011 - 7:12

    Sí, sí. Además, con el tema de las variables, si hago, por ejemplo, un ‘echo $GCC’ me escribe /home/borjagt/backfire/stagin_dir/toolchain-mips_r2_gcc-4.3.3+cs_uClibc-0.9.30.1/usr/bin/mips-openwrt-linux-gcc. En cambio, durante la compilación del jamVM aparece:
    bla bla bla…
    checking build system type… i686-pc-linux-gnu
    checking host system type… mips-openwrt-linux-gnu
    checking target system type… mips-openwrt-linux-gnu
    checking for a BSD-compatible install… /usr/bin/install -c
    checking whether build environment is sane… yes
    checking for a thread-safe mkdir -p… /bin/mkdir -p
    checking for gawk… gawk
    checking whether make sets $(MAKE)… yes
    checking for mips-openwrt-linux-strip… no
    checking for strip… strip
    checking how to create a ustar tar archive… gnutar
    checking for style of include used by make… GNU
    checking for mips-openwrt-linux-gcc… no <—– ESTO !!!!!!
    checking for gcc… gcc
    checking for C compiler default output file name… a.out
    checking whether the C compiler works… yes
    checking whether we are cross compiling… no <—– ESTO !!!!!!

    bla bla bla…
    checking for a BSD-compatible install… /usr/bin/install -c
    checking for mips-openwrt-linux-g++… no <—– y todo ESTO !!!!!!
    checking for mips-openwrt-linux-c++… no
    checking for mips-openwrt-linux-gpp… no
    checking for mips-openwrt-linux-aCC… no
    checking for mips-openwrt-linux-CC… no
    checking for mips-openwrt-linux-cxx… no
    checking for mips-openwrt-linux-cc++… no
    checking for mips-openwrt-linux-cl.exe… no
    checking for mips-openwrt-linux-FCC… no
    checking for mips-openwrt-linux-KCC… no
    checking for mips-openwrt-linux-RCC… no
    checking for mips-openwrt-linux-xlC_r… no
    checking for mips-openwrt-linux-xlC… no
    checking for g++… g++
    checking whether we are using the GNU C++ compiler… yes
    bla bla bla…

    alguna idea???

  9. #9 by Luis Gallardo on 25/07/2011 - 5:48

    @Borja colocaste –target=mips-openwrt-linux –host=mips-openwrt-linux (son dos guiones en cada caso) ?

  10. #10 by Borja on 25/07/2011 - 5:41

    Hola, antes que nada gracias por responder tan pronto! ;-)

    He seguido los pasos: he descargado via subversion el openwrt backfire, con make menuconfig he indicado Target System (Atheros AR71xx/AR7240/AR913x), y Target Profile (Ubiquiti RouterStation Pro). Tambien he marcado la opción Build openwrt based toolchain. Finalmente he salido del menu y ejecuto make.
    Todo correcto sin errores.

    Entiendo que ya tengo los toolchain (de hecho aparecen en la ruta que indicas en el articulo). Pero al querer compilar el jamVM con ./configure –target=mips-openwrt-linux –host=mips-openwrt-linux, me da como resultado: Invalid configuration ‘mips-openwrt-linux-gcc': machine ‘mips-openwrt-linux-gcc’ not recognized.

    ¿Qué hago mal? ¿Qué me he dejado?
    Ayuda por favor. Gracias.

  11. #11 by Luis Gallardo on 25/07/2011 - 8:53

    @Borja para hacer lo que quieres basta con bajarte las fuentes de OpenWrt y compilar el paquete de java en una imagen nueva. Puedes seguir los pasos explicados aquí de cómo construir una imagen de Opewrt.

    Este artículo habla de cómo cross-compilar fuera de las herramientas de OpenWrt pero usando el toolchain que viene en la imagen de OpenWrt.

    Saludos!

  12. #12 by Borja on 25/07/2011 - 8:12

    Hola.
    Estoy intentando compilar e instalar el jamVM en una RouterStation Pro de Ubiquiti para ejecutar programas Java. Después de mucho googlear he llegado a la conclusión que debo hacer compilación cruzada. Pero soy bastante nuevo en Linux y algunos conceptos se me escapan.
    Siguiendo el ejemplo del artículo: ¿debo hacerlo en la routerstation o en mi PC con Ubuntu? He probado los dos y en ninguno tengo el toolchain-mips. ¿Donde se consigue?

    Gracias por adelantado.

(No será publicado)