¿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