• Viernes 17 de Mayo de 2024, 06:32

Autor Tema:  Compilación cruzada  (Leído 4003 veces)

GsOiD

  • Miembro activo
  • **
  • Mensajes: 83
  • Nacionalidad: mx
    • Ver Perfil
Compilación cruzada
« en: Domingo 12 de Junio de 2011, 08:21 »
0
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é.

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Compilación cruzada
« Respuesta #1 en: Domingo 12 de Junio de 2011, 19:09 »
0
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 tienes un "How to" si quieres hacer uno. Hoy en dia es mas facil usar una maquina virtual que usar un compilador en cruz.
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

GsOiD

  • Miembro activo
  • **
  • Mensajes: 83
  • Nacionalidad: mx
    • Ver Perfil
Re: Compilación cruzada
« Respuesta #2 en: Lunes 13 de Junio de 2011, 00:33 »
0
gracias... le hecharé una hojeada. Cuando logre hacer algo comento..  :comp:

GsOiD

  • Miembro activo
  • **
  • Mensajes: 83
  • Nacionalidad: mx
    • Ver Perfil
Re: Compilación cruzada
« Respuesta #3 en: Miércoles 15 de Junio de 2011, 01:40 »
0
¿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

GsOiD

  • Miembro activo
  • **
  • Mensajes: 83
  • Nacionalidad: mx
    • Ver Perfil
Re: Compilación cruzada
« Respuesta #4 en: Miércoles 15 de Junio de 2011, 02:06 »
0
Abajo está todo... esta cosa se volvió loca    :P
« última modificación: Miércoles 15 de Junio de 2011, 02:36 por GsOiD »

GsOiD

  • Miembro activo
  • **
  • Mensajes: 83
  • Nacionalidad: mx
    • Ver Perfil
Re: Compilación cruzada
« Respuesta #5 en: Miércoles 15 de Junio de 2011, 02:34 »
0
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...

Citar
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  "tar -cf - /usr/local/include" | tar -xvf -
$ ssh tss-3-04@ce.azc.uam.mx  "tar -cf - /usr/lib" | tar -xvf -
$ ssh tss-3-04@ce.azc.uam.mx  "tar -cf - /usr/openwin/include" | tar -xvf -
$ ssh tss-3-04@ce.azc.uam.mx "tar -cf - /usr/X11/include" | tar -xvf -
$ ssh 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         ! descargo binutils
$ wget http://ftp.gnu.org/gnu/gcc/gcc-4.6.0/gcc-4.6.0.tar.gz     ! 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                             ! 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
2.- http://www.escomposlinux.org/lfs-es/lfs ... pass1.html
3.- http://www.linuxfromscratch.org/lfs/vie ... pass1.html

Cualquier duda mandarme un mensaje  :hola: