Mostrando entradas con la etiqueta compilar. Mostrar todas las entradas
Mostrando entradas con la etiqueta compilar. Mostrar todas las entradas

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.

miércoles, septiembre 05, 2007

No puedo compilar en el server

La última vez que compile en el servidor fue cuando estuve con el LFS, luego como sabéis conseguí reparar la fonera y me puse a trabajar con ella, ya que era mi principal objetivo. Como ya queda poco para que empiece el curso, porque no es en octubre como muchos creíamos, es sobre el 20 de este mes, tengo que preguntar cuando es exactamente, bueno que me voy del tema, como queda poco estoy preparando ya el ultimo experimento (lo del modo cliente), y quería compilar una herramienta para la fonera, se trata de amap, un paquete que averigua que servicio corre en cada puerto abierto (no, nmap no lo hace), antes de hacer la compilacion cruzada probé a compilarlo para mi servidor también, pero ejecuto el ./configure y me da este error:

# ./configure
loading cache ./config.cache
checking for a BSD compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking whether make sets ${MAKE}... yes
checking for working aclocal... found
checking for working autoconf... found
checking for working automake... found
checking for working autoheader... found
checking for working makeinfo... missing
checking for gcc... gcc
checking whether the C compiler (gcc ) works... no
configure: error: installation or configuration problem: C compiler cannot create executables.

Entonces, yo para comprobar que pasaba intenté compilar algo, porque ahí pone que gcc no puede crear ejecutables (WTF!), creé un fichero (test.c) que no es mas que un hola mundo y lo intenté compilar:

# gcc test.c -o test
/usr/local/bin/ld: opción `--hash-style=both' no reconocida
/usr/local/bin/ld: use la opción --help para información de modo de empleo
collect2: ld returned 1 exit status

No compila y la verdad es que no se que hacer, he googleado y no he encontrado nada, he buscado en todas partes pero no ha habido manera, así que he preguntado en un foro, esdebian.org, a ver si alguien puede ayudarme. Luego la idea sería hacer compilación cruzada y compilarlo con el toolchain de openwrt.

Mientras se soluciona ese contratiempo voy a seguir por otro frente, voy a configurar la red inalámbrica de mi otro router con wpa, y voy a intentar que la fonera se conecte a él, ya que la red wifi de mi instituto esta cifrada con wpa, aunque como ya he dicho en otras ocasiones tengo el fichero de configuración con la clave, así que no debería serme mayor problema.

Yo por último un comentario sobre el pendrive, hoy se cumplen las 48 horas, debería llegarme...

lunes, junio 25, 2007

Problemas compilando el código de la fonera

Como tengo un verano por delante para montar bien lo de la fonera, voy a estudiar al máximo todos los temas. Lo primero que he querido hacer es compilar el código de la fonera y pasan dos cosas, la primera es que es un proceso largo y luego da como resultado (según he leído) mas de 1 GB de datos así que decidí que lo mejor era hacerlo en el server, nada cojo y descargo el código de la fonera mediante wget, lo descomprimo y para compilarlo primero hay que seleccionar los paquetes que se quieren y a continuación compilar. Ejecuto make menuconfig para el primer paso y salí sin hacer ningún cambio, simplemente lo dejo con la configuración por defecto, después ejecute make para compilar y empieza a trabajar... sigue trabajando... no para... y esto que ayer me dieron ya las once y media de la noche y yo por las noches apago el servidor, así que pienso: "lo paro y ya lo volveré a hacer mañana por la mañana con mas tiempo", y así lo hice, lo paré y apagué el server.

Pero claro no todo podía ser tan fácil, lo que yo tenía pensado es dejar el servidor compilando mientras yo me iba a la playa, así cuando volviera ya debía estar todo listo, nada mas lejos de la realidad. Me levanto, enciendo el server, el router, la fonera y el portátil, me conecto por ssh al server, me voy al directorio /media/hdd/fonera y ejecuto make menuconfig, errores, vale porque no funciona hoy si ayer iba perfectamente? bueno pienso que a lo mejor se han modificado algunos ficheros por la compilación de anoche que corte por el camino, así que decido borrar todos esos archivos y descomprimir de nuevo el archivo fonera.tar.bz2, el que descargué de la web de fon y contiene el código, ahora ejecuto de nuevo make menuconfig y tampoco me funciona, WTF!! pero si ayer funcionó perfectamente y a la primera! bueno, sigo intentando de todo pero nada, reinstalé las herramientas necesarias para compilar el código (build-essential, flex, make, gcc, binutils...) pero nada no he conseguido que funcione, he mirado en google y no he visto nada útil... no se que hacer, haber si se me ocurre algo, de todas formas, por si algún lector puede ayudarme el error que me da al ejecutar make menuconfig es este:

svn: '.' is not a working copy
make: execvp: ./scripts/timestamp.pl: Permiso denegado
Collecting package info...
./scripts/gen_menuconfig.pl < .pkginfo > .config.in || rm -f .config.in
/bin/sh: ./scripts/gen_menuconfig.pl: /usr/bin/perl: bad interpreter: Permiso denegado
cmd() { &>/dev/null make $* || { echo "Build failed. Please re-run make with V=99 to see what's going on"; /bin/false; } } 3>&1 4>&amp;amp;amp;amp;amp;2; cmd -C scripts/config all
make: execvp: scripts/config/mconf: Permiso denegado
make: *** [menuconfig] Error 127

También siguiendo el consejo que pone ahí probé con make menuconfig V=99, pero tampoco funciona, esto es lo que me suelta:

svn: '.' is not a working copy
make: execvp: ./scripts/timestamp.pl: Permiso denegado
Collecting package info...
./scripts/gen_menuconfig.pl < .pkginfo > .config.in || rm -f .config.in
/bin/sh: ./scripts/gen_menuconfig.pl: /usr/bin/perl: bad interpreter: Permiso denegado
make -C scripts/config all
make[1]: se ingresa al directorio `/media/hdd/fonera/scripts/config'
make -C lxdialog
make[2]: se ingresa al directorio `/media/hdd/fonera/scripts/config/lxdialog'
make[2]: No se hace nada para `all'.
make[2]: se sale del directorio `/media/hdd/fonera/scripts/config/lxdialog'
make[1]: se sale del directorio `/media/hdd/fonera/scripts/config'
scripts/config/mconf Config.in
make: execvp: scripts/config/mconf: Permiso denegado
make: *** [menuconfig] Error 127

Además también quiero que conste que ayer cuando funcionó no tuve que poner el V=99.

En fin, se ve que el servidor solo va a darme problemas inexplicables, cuando no de hardware, de software... a ver si consigo compilar el código de una vez.

[EDIT]

Finalmente he conseguido compilar el código, lo que no se muy bien es que ha pasado que ahora ha funcionado y antes no lo hacía, os cuento lo que he hecho. Antes cuando estaba con el disco duro antiguo (6gb) era conocido en el sistema como /dev/hdd, ahora el nuevo disco duro que he puesto es /dev/hde. El antiguo lo montaba en /media/hdd/, cuando cambié el disco duro cambié el /etc/fstab y puse en ese directorio /dev/hde1 (nuevo hd) en lugar de /dev/hdd1 (antiguo hd). Entonces la primera vez que hice el proceso funcionó, a partir de entonces, al día siguiente, ya no funcionaba, no podía compilarlo. Hoy he cambiado de opinión y he cambiado el punto de montaje de /dev/hde1, he preferido ponerlo en un directorio acorde a su nombre /media/hde, acto seguido volví a intentar la compilación y funcionó perfectamente, lo deje con la configuración por defecto y ejecuté make para compilar, después de un buen rato ha terminado.

En fonera/build_mips/root tengo el mismo contenido que en la fonera. Si os interesa aquí podéis ver un interesante post sobre como compilar para la fonera y como portar aplicaciones para la fonera.