Compilación cruzada (OpenWrt)

Descargo en primer lugar toda la rama de desarrollo del svn de OpenWrt:

~$ svn co https://svn.openwrt.org/openwrt/trunk/

Error validando el certificado del servidor de 'https://svn.openwrt.org:443':
- El certificado no fue emitido por una autoridad marcada como

( Bla, bla, bla... )

- "Huella": a1:0a:d8:2d:af:4e:67:92:18:a0:27:b6:9f:2b:e1:12:08:28:a0:b1
¿(R)echazar, aceptar (t)emporariamente o aceptar (p)ermanentemente? t

Se nos crea en el HOME un directorio trunk/ con todo el tinglado necesario para compilar .
Es necesario tener instalados los siguientes paquetes gcc, binutils, patch, bzip2, flex, bison,make, gettext, pkg-config, unzip, ibz-dev y libc headers para que no nos de error el
~/trunk$ make menuconfig donde podremos configurar el toolchain y el firmware:



Hago los cambios oportunos y salgo guardándolos.
Continúo con un interminable
~/trunk$ make
que descargará las fuentes, construirá las herramientas para la compilación cruzada y compilará el firmware.

:~/trunk$ make
++ mkdir -p /home/kir/trunk/staging_dir/toolchain-mips_gcc4.1.2
++ cd /home/kir/trunk/staging_dir/toolchain-mips_gcc4.1.2
++ mkdir -p bin lib include stamp
Checking 'bison'... ok.
make[1] world
make[2] tools/install

( Más bla, bla, bla )

make[2] package/rootfs-prepare
make[3] package/preconfig
make[2] target/install
make[3] -C target/linux install
make[3] -C target/sdk install
make[2] package/index


En ~/trunk/bin tendremos nuestro nuevo firmware con el que podremos flashear la fonera.

*Compilar programas

Preparo un script llamado sdk el cual al invocarlo con el menu ( uso pekwm como gestor de ventanas ) exporta la variable $PATH con la ruta hacia los binarios del compilador y la variable CC para que use el compilador de C para architectura MIPS.

export PATH=$PATH:/home/kir/trunk/staging_dir/toolchain-mips_gcc4.1.2/bin/
export CC=mips-linux-uclibc-gcc
cd /home/kir/trunk/package
TERM="xterm -fn fixed +sb -bg black -fg green -T sdk"
$TERM


Doy permiso de ejecución al script y lo guardo en un directorio en la ruta del PATH.

En ~/.pekwm/menu añado una entrada que llama a un xterm con los settings anteriores:
Entry = "SDK" { Actions = "Exec $TERM -iconic -e sdk &" }

* wavemon

Descargo las sources de wavemon con apt en /home/kir/trunk/package , aplico el parche http://kir.sdf-eu.org/wavemon_patch/ y hago un ./configure --host=mips-linux.
No da ningun error y ejecuto un make:
Ahora sí que da error, no encuentra ncurses.h
mips-linux-uclibc-gcc -O2 -Wall -c -o ui.o ui.c
ui.c:25:21: error: ncurses.h: No such file or directory

Creo que toca compilar ncurses.

$ cd build_dir/mips/ncurses-5.6/
./configure --host=mips-linux
make

Copio los archivos de ~/trunk/build_dir/mips/ncurses-5.6/lib
y ~/trunk/build_dir/mips/ncurses-5.6/include a ~/trunk/staging_dir/toolchain-mips_gcc4.1.2/include
y bin/
respectivamente.Creo el enlace simbólico ncurses.h que apunta a curses.h y repito el make para wavemon.
Aparecen varios warning pero finalmente compila sin errores:
file wavemon
wavemon: ELF 32-bit MSB executable, MIPS, version 1 (SYSV), dynamically linked (uses shared libs), not stripped
ls -l wavemon
-rwxr-xr-x 1 kir kir 78695 2008-09-17 09:34 wavemon

A continuación "estripo" el binario para que ocupe menos:
mips-linux-strip wavemon
file wavemon
wavemon: ELF 32-bit MSB executable, MIPS, version 1 (SYSV), dynamically linked (uses shared libs), stripped
ls -l wavemon
-rwxr-xr-x 1 kir kir 71280 2008-09-17 09:41 wavemon
.
Con strip el binario se redujo de 78965 a 71280 bytes.
Sólo queda pasarlo a la fonera con scp, wget o como nos venga en gana y disfrutarlo:

* Netdiscover

Descargo las fuentes de netdiscover con apt:
~/trunk/package$ apt-get source netdiscover
cd netdiscover-0.3beta6/
~/trunk/package/netdiscover-0.3beta6$ ./configure --host=mips-linux
.....
checking for pcap.h... no
configure: error: Cannot find pcap.h - You need libpcap installed.


Necesita libpcap, que ya está en
~/trunk$ cd build_dir/mips/libpcap-0.9.8/

En ~/trunk/build_dir/mips/libpcap-0.9.8/ipkg-install/usr tenemos los directorios include/ y lib/ . Copio su contenido a ~/trunk/staging_dir/toolchain-mips_gcc4.1.2/include y lib/ como anteriormente y repito el .configure
./configure --host=mips-linux

checking for libnet.h... no
configure: error: Cannot find libnet.h - You need libnet installed.


Bien, ya tragó con libpcap pero se atraganta con libnet, así que lo descargo.
~/trunk/package$ wget http://downloads.openwrt.org/sources/libnet.tar.gz
~/trunk/package$ tar zxvf libnet.tar.gz
~/trunk/package$ cd libnet/

El configure no da problemas pero make muestra un error:
In file included from libnet_asn1.c:60:
../include/libnet.h:117:10: error: macro names must be identifiers

Edito la línea que es un #define 1 y la cambio a #define LIBNET_BIG_ENDIAN 1
A continuación ejecuto el make sin ningún error (aunque da varios warnings) pero no me aparece ningun directorio con las librerias.
Cambio la estrategia e instalo otra versión desde el mismo ftp de OpenWrt: wget http://downloads.openwrt.org/sources/libnet-1.0.2a.tar.gz

Descomprimo, cambio al directorio, bla, bla, bla... y no funciona.

Nuevo intento descargando libnet con apt
~/trunk/package$ apt-get source libnet1
...
In file included from libnet_asn1.c:60:
../include/libnet.h:117:10: error: macro names must be identifiers

Ya empezamos ...
Edito y añado LIBNET_BIG_ENDIAN a la linea del #define 1 (#define LIBNET_BIG_ENDIAN 1) y voilà que compila el jodido!
Ahora toca copiar los archivos .h y las librerias como anteriormente.. y sigue sin ir la cosa.

Vuelvo a ejecutar el configure con la opción --prefix:
./configure --host=mips --prefix=/home/kir/trunk/staging_dir/toolchain-mips_gcc4.1.2/
make
make install


Compila y se instala sin errores; cambio al directorio de netdiscover y
~/trunk/package/netdiscover-0.3beta6$ ./configure --host=mips-linux

y....

checking libnet.h usability... yes
checking libnet.h presence... yes
checking for libnet.h... yes

~/trunk/package/netdiscover-0.3beta6$ make
O.K.
cd src
file netdiscover
netdiscover: ELF 32-bit MSB executable, MIPS, version 1 (SYSV), dynamically linked (uses shared libs), not stripped
ls -l netdiscover
-rwxr-xr-x 1 kir kir 441081 2008-09-18 09:36 netdiscover
mips-linux-strip netdiscover
file netdiscover
netdiscover: ELF 32-bit MSB executable, MIPS, version 1 (SYSV), dynamically linked (uses shared libs), stripped
ls -l netdiscover
-rwxr-xr-x 1 kir kir 367388 2008-09-18 09:38 netdiscover


Parece ser que para usar nuevas librerías, hay que compilarlas usando la opción --prefix en el ./configure; así le indicamos el compilador dónde está el lib/ y el /include .

Los binarios están en http://kir.sdf-eu.org/kamikaze_808



Enlaces:
Documentación de Kamikaze
OpenWrt Programming
Build-root documentation
Compilación cruzada

No hay comentarios: