martes, septiembre 11, 2007

Compilando para la fonera

Para conseguir mi objetivo con la fonera, (lo del modo monitor), necesito algunas herramientas que no existen como paquetes precompilados para la fonera, tengo que compilarlos yo. Realmente tampoco me he puesto muy en serio con el tema todavía y solo se me ha ocurrido una herramienta que compilar, se trata de amap, que averigua que servicio corre en cada puerto, nmap simplemente ve que puertos están abiertos, mira en su base de datos de puertos conocidos y te pone el servicio que debería ir ahí, por ejemplo, si tu tienes un ftp en el puerto 80 nmap te dirá que el puerto esta abierto, pero pondrá http, no ftp. Amap trabaja de otra manera, esta herramienta mira como responden los servicios que tras esos puertos y te dice que es lo que hay, incluso puede llegar a decirte el programa y su versión, no simplemente dice es un servidor ftp, puede que te diga que servidor es y su versión. Vamos una herramienta muy útil.

Recapitulando un poco, a mi me daba un error de ld al intentar compilar cualquier cosa, ya fuera compilación normal o compilación cruzada. Pregunté en un foro y me dijeron que tenía el ld de mi sistema y otro que había compilado yo (supongo que hice algo mal durante el lfs). Así que eliminé el que yo compile ya que no me valía para nada y ya funcionó, ahora si puedo compilar tanto de forma normal como cruzada. Aquí esta el hola mundo, que al fin funcionó:

# gcc test.c -o test
# ./test
¡Hola, mundo!

Ahora veamos como compilar nuestro hola mundo para que funcione en OpenWrt en mi fonera, luego veremos como compilar amap para la fonera. Lo primero que necesitamos es el toolchain (herramientas de desarrollo) de openwrt para nuestra arquitectura (de la maquina donde compilaremos), yo me bajé i686, también hay para x86_64. La versión para i686 ahora mismo no la encuentro en la web oficial, en su día me costo encontrar el enlace, así que la subo yo y si la queréis os la bajáis de aquí. Lo primero, como es lógico, es descomprimirlo, luego tenemos que añadir la ruta de los archivos para compilar al path. Dichos archivos se encuentran en OpenWrt-SDK-atheros-2.6-for-Linux-i686/staging_dir_mips/bin. Para hacerlo estando en el directorio donde descomprimimos, en mi caso /media/almacen/toolchain/, ejecutamos:

export PATH=`pwd`/OpenWrt-SDK-atheros-2.6-for-Linux-i686/staging_dir_mips/bin:$PATH

Ahora para comprobar que todo ha salido bien ejecutamos echo $PATH, en el resultado tiene que estar nuestro directorio:

/media/almacen/toolchain/OpenWrt-SDK-atheros-2.6-for-Linux-i686/staging_dir_mips/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Queda un poquito largo, no importa, mientras funcione. Ya podemos probar, compilando, por ejemplo nuestro hola mundo:

# mips-linux-gcc test.c -o test

Si ahora intentamos ejecutarlo, no podremos, eso es porque el ejecutable es para otra arquitectura:

# ./test
-bash: ./test: cannot execute binary file

Sin embargo si lo ejecutamos en la fonera la cosa cambiará, para pasarlo a la fonera hay varias maneras, yo suelo hacerlo mediante netcat o mediante http. Como tengo un servidor http en el server simplemente lo he copiado a /var/www (luego lo haremos con netcat). Luego en la fonera lo descargamos y ejecutamos:

# wget http://debian/test
# chmod +x test
# ./test
¡Hola, mundo!

Funciona! vale, ya sabemos como compilar cosas "sencillas", ahora vamos a intentar compilar algo se hace con el clásico ./configure... amap nos servirá. Lo primero es tener el código de amap, aquí nuevamente he perdido el enlace, así que os lo subo yo también, aquí. La forma normal de compilarlo es la normal de estos paquetes:

# tar -xzvf amap-5.2.tar.gz
# cd amap-5.2
# ./configure
# make
# make install

Con eso lo tenemos para usar en nuestra maquina local, que yo también lo he hecho porque es muy útil. Ahora veamos como hacemos para que se compile usando los archivos de nuestro SDK (Software Development Kit), es decir, para usar el compilador de la fonera. Me imagino que habrá distintas formas de hacer esto, investigaré un poco para ver cual es la mejor y mas cómoda. A me se me ocurren tres, una es modificar el configure, otra es modificar el Makefile y la última que no se si será posible: en alguna parte del sistema tiene que estar escrito que compilador se usa, si cambio esa configuración y en vez de gcc pongo mips-linux-gcc estaría todo solucionado. Yo he optado por modificar el (los) Makefile, porque en el configure no he encontrado donde hacer los cambios. He hecho esto:

# ./configure

Y después he modificado los dos Makefiles que hay. Si os fijáis hay uno en el directorio en el que estamos (amap-5.2/) y otro dentro de pcre-3.9/. En el primero de ellos solo he cambiado la variable CC, he puesto esto:

CC=mips-linux-uclibc-gcc

Y en el segundo he cambiado CC, RANLIB y STRIP, todos ellos hay que cambiarlos por los de la fonera:

CC = mips-linux-uclibc-gcc
RANLIB = mips-linux-uclibc-ranlib

STRIP = mips-linux-uclibc-strip

Puede que os preguntéis porque he cambiado esas variables, y que como vais a saber que variables cambiar cuando tengáis que compilar otro programa. Existe un conjunto de programas (binutils) que son el compilador, el linkador, etc. El compilador gcc de mi debian i386 no valdrá para la fonera, y tampoco valdrá el linkador ld de mi fonera en mi server. Entonces yo he mirado los nombres de las binutils de la fonera en OpenWrt-SDK-atheros-2.6-for-Linux-i686/staging_dir_mips/bin, y veo los nombres, por ejemplo: gcc, ar, as, c++, ld... De esta manera cuando yo en el Makefile vea gcc lo cambio por mips-linux-gcc, ar lo cambio por mips-linux-ar, etc. Estoy seguro de que debe existir algún método mejor, que intentaré averiguar, pero mientras no lo sepa esta es mi única solución.

Después de haber hecho los cambios precisos compilamos:

make

Si ahora intentamos ejecutar el archivo tampoco podremos, es para la fonera, no para un x86:

# ./amap
-bash: ./amap: cannot execute binary file

Sin embargo si lo pasamos a la fonera, esta vez con netcat, funcionará. Ejecutamos en el server:

# cat amap | nc fonera 9999

En la fonera:

# nc -l -p 9999 > amap

Y ya podemos darle permisos y ejecutarlo. De todas formas todavía no funcionara bien, porque para comprobar que servicio está en cada puerto compara la respuesta con una base de datos, también tiene que estar en la fonera. Supongo que sera cosa de añadirlo al directorio adecuado, todavía no lo he hecho, en cualquier caso pienso hacer un paquete ipk por cada programa que vaya a usar, seguiré trabajando con este hasta tenerlo todo listo. En cualquier caso, lo que me he interesa ya lo he conseguido: esta compilado.

Ahora buscaré un método mas cómodo, rápido y sencillo para hacer compilación cruzada, aprenderé a hacer paquetes ipk, y me pondré a programar el script que me haga un análisis de la red.

2 comentarios:

Anónimo dijo...

Gracias ;-)

Anónimo dijo...

Nice post and this mail helped me alot in my college assignement. Thanks you for your information.