SoloCodigo
Programación General => C/C++ => Mensaje iniciado por: GsOiD en Domingo 12 de Junio de 2011, 08:21
-
Hola que tal... he estado checando en la red, cómo realizar compilación cruzada...
Si alguien tiene experiencia en esto y me puede dar un panorama general de lo que se requiere hacer para generar el entorno de compilación cruzada, se lo agradeceré.
-
Ese es un tema interesante y muy dificil. Yo hace tiempo intente hacer mi propio toolchain pero es mucho trabajo, y se presentan ciertas complicaciones... lo mejor es conseguir uno ya hecho.
Aqui (http://www.kegel.com/crosstool/crosstool-0.43/doc/crosstool-howto.html) tienes un "How to" si quieres hacer uno. Hoy en dia es mas facil usar una maquina virtual que usar un compilador en cruz.
-
gracias... le hecharé una hojeada. Cuando logre hacer algo comento.. :comp:
-
¿Qué es la compilación cruzada?
Un compilador es un programa que transforma codigo a codigo ejecutable (básicamente). Como todos los programas un compilador corre en un tipo específico de computadora, y los resultados de los programas que compila (los codigos ejecutables) también corren en un tipo específico de computadora.
La computadora en donde el compilador funciona, es llamada el Host, y la computadora en donde los programas se ejecutan se llama objetivo. Entonces cuando el host y objetivo son el mismo tipo de máquina, el compilador es un compilador nativo. Y cuando el host y el objetivo son diferentes, el compilador es un compilador cruzado.
¿El porqué de la compilación cruzada?
En teoría, un usuario que desea construir programas para un dispositivo podría conseguir el hardware objetivo apropiado (o emulador), arrancar una distribución linux en el, y compilar nativamente sin ese entorno. Si este un enfoque valido, tiene algunas desventajas importantes para cosas como un router linksys o un ipod.
Velocidad
Capacidad
Disponibilidad
Flexibilidad
Conveniencia
¿Porqué la compilación cruzada es difícil?
La compilación nativa portable es difícil
La mayoría de los programas son desarrollados en hardware x86, en donde son compilados nativamente. Esto significa que la compilación cruzada se encuentra con dos tipos de problemas: problemas con el mismo programa y problemas con el sistema de construcción.
1.- El primer problema afecta a todos los objetivos que no son x86, tanto para construcciones nativas y cruzadas. Muchos programas suponen acerca del tipo de máquina en el que se ejecutan, en donde deben coincidir con la plataforma en cuestión o el programa no servirá. Los supuestos más comunes son:
*El tamaño de palabra
*Endianes
*Alineación: algunas plataformas pueden sólo leer o escribir instrucciones de direcciones que sólo son múltiplo de 4 bytes.
*Signo por defecto
*NOMMU: si la plataforma de tu sistema objetivo no tiene una unidad de manejo de memoria, varias cosas necesitan cambiar.
2.- Además de los problemas de la compilación nativa, la compilación cruzada tiene su propio conjunto de problemas:
*Problemas de configuración
*Hostcc vs Targetcc
*Fugas de la cadena de herramientas (Toolchain)
*Bibliotecas
*Pruebas
-
Abajo está todo... esta cosa se volvió loca :P
-
Ups, lo envié sin explicar cómo he hecho el trabajo... Esto lo hice desde un linux-ubuntu11.04 Intel para un onjetivo: sparc con sun-solaris2.10
LO QUE APARECE DESPUÉS DE CADA ! ES UN COMENTARIO.
Bien, aquí les va// todo lo hago como root, esto porque puedo, y además si estoy como usuario y luego me paso a root para hacer los make install, las variables de entorno "desaparecen" los valores que les asigné, y tendría que reasignar valores y eso me dió flojera.. pero lo recomendable es no trabajar como root...
a) Establecer las variables de entorno temporales, para la seción que inicie.
$ export TARGET=sparc-sun-solaris2.10 !especifico el objetivo, al tipear $ gcc -dumpmachine en la máquina objetivo obtuve sparc-sun-solaris2.10
$ export PREFIX=$HOME/cross !aquí indico el directorio en donde surgirá la magia, el cual aún no existe
$ export SYSROOT=$PREFIX/sysroot !aquí especifico el directorio en donde almacenaré las bibliotecas y headers del sis objetivo que se requieren...
$ export PATH=$PREFIX/bin/:$PATH
b)Crear la estructura de directorios para la compilación:
$ mkdir $PREFIX !crea el directorio /cross dentro de /home/yo
$ mkdir $SYSROOT !crea el directorio /sysroot dentro de /home/yo/sysroot
c) Copiando las bibliotecas y headers del sistema objetivo necesarias... lo hago remotamente... dentro de sysroot
$ cd $SYSROOT ! que equivale a $ cd /home/yo/cross/sysroot
$ ssh tss-3-04@ce.azc.uam.mx (http://mailto:tss-3-04@ce.azc.uam.mx) "tar -cf - /usr/local/include" | tar -xvf -
$ ssh tss-3-04@ce.azc.uam.mx (http://mailto:tss-3-04@ce.azc.uam.mx) "tar -cf - /usr/lib" | tar -xvf -
$ ssh tss-3-04@ce.azc.uam.mx (http://mailto:tss-3-04@ce.azc.uam.mx) "tar -cf - /usr/openwin/include" | tar -xvf -
$ ssh tss-3-04@ce.azc.uam.mx (http://mailto:tss-3-04@ce.azc.uam.mx) "tar -cf - /usr/X11/include" | tar -xvf -
$ ssh tss-3-04@ce.azc.uam.mx (http://mailto:tss-3-04@ce.azc.uam.mx) "tar -cf - /usr/dt/lib" | tar -xvf -
$ ssh http://ftp.gnu.org/gnu/binutils/binutils-2.21.tar.gz (http://ftp.gnu.org/gnu/binutils/binutils-2.21.tar.gz" onclick="window.open(this.href);return false;) ! descargo binutils
$ wget http://ftp.gnu.org/gnu/gcc/gcc-4.6.0/gcc-4.6.0.tar.gz (http://ftp.gnu.org/gnu/gcc/gcc-4.6.0/gcc-4.6.0.tar.gz" onclick="window.open(this.href);return false;) ! descargo gcc
$ tar -xvzf binutils-2.21.tar.gz ! descomprimo binutils-2.21.tar.gz
$ cd binutils-build ! ingreso al directorio binutils-build
$ ../binutils-2.21/configure --target=$TARGET --prefix=$PREFIX --disable-nls --disable-werror --with-sysroot=$SYSROOT -v ! configuro binutils
$ make
$ make install ! instalo una vez configurado y todo
$ cd .. ! me salgo de binutils-build y regreso a /buil
$ tar -xvzf gcc-4.6.0.tar.gz ! descomprimo gcc-4.6.0.tar.gz
$ cd gcc-build ! ingreso a gcc-build
$ ../gcc-4.6.0/configure --target=$TARGET --prefix=$PREFIX --disable-nls --disable-shared --disable-multilib --disable-target-libiberty --disable-target-zlib --enable-languages=c --without-ppl --without-cloog --with-sysroot=$SYSROOT -v ! configuro gcc
$ make
$ make install
LISTO !!!!!
e) Probando
! Dentro de /home/yo/cross guardo un programa en c ... yo probé un hola mundo... el clásico. n__n Lo coloqué ahí, porque ese es mi entorno de compilación... en otro lado esto no funcionará.
$ $PREFIX/bin/$TARGET-gcc hola.c -o hello ! para compilar de forma cruzada hago eso. No confundas $ que es el prompt de linux con el que indica que vas a usar el valor de la variable de entorno.
Ahora debes ver un ejecutable llamado hello .... te reto a que lo ejecutes en tu sistema host. :rolleyes: No se puede... a mi me arrojó esto:
bash: ./hello: no se puede ejecutar el fichero binario
Entonces copié a mi máquina remota, el ejecutable, para probar si funciona ahí....
$ scp hello tss-3-04@ce.azc.uam.mx (http://mailto:tss-3-04@ce.azc.uam.mx) ! ahora ingresé a la máquina remota para ejecutar directamente el archivo que copie. :comp: Escribo la contraseña.
$ cd carla !entro al directorio donde debe estar mi archivo "hello"
$ ./hello ! ya que lo ví, lo ejecuto.
Hola Carla, bienvenida al mundo !!! ! ese fue el resultado de mi programa... así que si funciona....
Ahora estoy lista para compilar cualquier cosa que desee ejecutar en el sparc :good:
Referencias:
1.- http://www.cis.upenn.edu/~milom/cross-compile.html (http://www.cis.upenn.edu/~milom/cross-compile.html" onclick="window.open(this.href);return false;)
2.- http://www.escomposlinux.org/lfs-es/lfs ... pass1.html (http://www.escomposlinux.org/lfs-es/lfs-es-5.0/chapter05/binutils-pass1.html" onclick="window.open(this.href);return false;)
3.- http://www.linuxfromscratch.org/lfs/vie ... pass1.html (http://www.linuxfromscratch.org/lfs/view/development/chapter05/gcc-pass1.html" onclick="window.open(this.href);return false;)
Cualquier duda mandarme un mensaje :hola: