2010-12-15 20 views
14

Recientemente he estado jugando con la compilación cruzada usando GCC y descubrí lo que parece ser un área complicada, cadenas de herramientas.Preguntas generales sobre GCC y compilación cruzada

No entiendo esto porque tenía la impresión de que GCC puede crear códigos de máquina binarios para la mayoría de las arquitecturas comunes, y todo lo demás realmente importa es con qué bibliotecas se enlaza y qué tipo de ejecutable se crea.

¿Puede GCC no hacer todas estas cosas? Con una compilación única de GCC, todas las bibliotecas apropiadas y las banderas correctas enviadas a GCC, podría producir un ejecutable PE para una máquina con Windows x86, luego crear un ejecutable ELF para un dispositivo MIPS Linux incorporado y finalmente un ejecutable para una PowerPC OSX ¿máquina? Si no, ¿alguien puede explicar cómo lo lograrías?

+0

la construcción individual de llvm es un poco más poderosa. Puede generar código para varios archios – osgx

+0

"explica cómo lo lograrías", con la creación de muchos entornos cruzados separados. – osgx

Respuesta

11

Con una sola acumulación de GCC, todos los bibliotecas apropiadas y las correctas banderas enviados a GCC, ¿podría producir un ejecutable PE para una máquina de Windows x86 , a continuación, crear un ejecutable ELF para un objeto incrustado ¿Dispositivo Linux MIPS y finalmente un ejecutable para una máquina PowerPC OSX ? Si no puede alguien explicar cómo lo lograría?

No. Una compilación única de GCC produce código de objeto para una arquitectura de destino. Necesitará una compilación que apunte a Intel x86, una compilación que apunte a MIPS y una compilación que apunte a PowerPC. Sin embargo, el compilador no es la única herramienta que necesita, a pesar de que puede compilar el código fuente en un ejecutable con una sola invocación de GCC. Debajo del capó, hace uso del ensamblador (as) y del enlazador (ld) también, y esos deben ser construidos para la arquitectura y la plataforma de destino. Por lo general, GCC usa las versiones de estas herramientas del paquete binutils de GNU, por lo que también debería compilarlo para la plataforma de destino.

Puede leer más sobre la construcción de una cadena de herramientas de compilación cruzada here.

yo no entiendo muy bien esto, ya que era bajo la impresión de GCC puede crear código binario de máquina para la mayoría de las arquitecturas comunes

Esto es cierto en el sentido de que el código fuente de GCC en sí mismo se puede construir en compiladores que se dirigen a varias arquitecturas, pero aún requiere compilaciones separadas.


En cuanto -march, esto no permite la misma acumulación de GCC para cambiar entre plataformas. Más bien se usa para seleccionar las instrucciones permitidas para usar para la misma familia de procesadores. Por ejemplo, algunas de las instrucciones admitidas por los procesadores x86 modernos no fueron compatibles con los procesadores x86 más antiguos porque se introdujeron más adelante (como conjuntos de instrucciones de extensión como MMX y SSE). Cuando pase -march, GCC habilita todos los códigos de operación admitidos en ese procesador y sus predecesores.Para citar el manual de GCC:

Mientras que la selección de un tipo específico de la CPU se horario cosas apropiadamente para que chip en particular, el compilador no generar cualquier código que se ejecuta en el i386 sin la -march = se usa la opción de tipo cpu .

+0

¿Esto significa que la capacidad para producir código de máquina para todas estas arquitecturas está en la fuente GCC, pero debe elegir una y solo una en tiempo de compilación? También ahora estoy confundido en cuanto a qué es -march = flag para – ArturPhilibin

+0

Sí, debe elegir la arquitectura en tiempo de compilación. Ver mi edición con respecto a '-march'. –

+1

Por cierto, es ciertamente posible que los compiladores nativos y cruzados coexistan en la misma máquina de desarrollo. Incluso múltiples compilaciones cruzadas para diferentes objetivos son posibles si tiene cuidado acerca de cómo los nombra y su RUTA. –

2

Si desea probar la compilación cruzada, y no desea construir la cadena de herramientas usted mismo, le recomiendo que consulte CodeSourcery. Tienen una cadena de herramientas basada en GNU, y su versión gratuita "Lite" admite bastantes arquitecturas. Lo he usado para Linux/ARM y Android/ARM.