2012-02-11 23 views
8

Sé que esta es una pregunta muy básica pero cuando compilo mi código c/C++ con gcc/g ++ ¿cuál es exactamente el tipo de salida intermedia antes de que el ensamblador entre en juego para generar el código de máquina? ¿Es algo así como las instrucciones de X86?gcc/g ++ tipo de salida

+2

¿Qué 'intermedio' de salida quiere decir? 'g ++' genera ensamblaje directamente. – Lol4t0

+0

Las siguientes opciones pueden ser útiles: '-g -Wa, -ahl = main.s'. Causan que GCC/G ++ emita el ensamblaje con código fuente intercalado de alto nivel. –

+0

Esta no es una pregunta básica en absoluto. – cha0site

Respuesta

12

cadena de procesamiento de GCC es el siguiente:

  • su código fuente

  • código fuente preprocesado (expanda macros e incluye, despoje comentarios) (-E, .ii)

  • compilar para ensamblar (-S, .s)

  • montar a binario (-c, .o)

  • enlace a ejecutable

En cada etapa He enumerado las opciones del compilador relevantes que hacen que el proceso se detiene allí , así como el sufijo de archivo correspondiente.

Si compila con -flto, los archivos de objeto se embellecerán con bytecode GIMPLE, que es un tipo de formato intermedio de bajo nivel, cuyo objetivo es retrasar la compilación final real a la etapa de vinculación, lo que permite optimizaciones de tiempo de enlace.

La etapa de "compilación" propiamente dicha es la parte de levantamiento de pesas real. El preprocesador es esencialmente una herramienta separada e independiente (aunque su comportamiento es un mandato de los estándares C y C++), y el ensamblador y el enlazador son herramientas autónomas independientes que básicamente implementan, respectivamente, el formato de instrucción binaria del hardware y el formato ejecutable cargable del sistema operativo.

+0

+1, excelente respuesta. Es posible que desee agregar una propaganda acerca de qué ensamblaje es, porque parece que el asker no está exactamente claro al respecto. – cha0site

+0

@ cha0site: gracias ... veamos; El OP es bienvenido para pedir aclaraciones, en cuyo caso me complacerá expandirme. –

+0

@KerrekSB muchas gracias por la respuesta detallada, creo que lo entiendo ahora. La respuesta de Zaraki Kenpachi a continuación fue muy útil también. ¿Entonces supongo que gcc obtiene información sobre mi hardware antes de generar el ensamblaje o hay un compilador separado para cada tipo de hardware? – Cemre

0

Debe ser un código de ensamblaje. Puede obtenerlo usando el indicador -S en la línea de comando para la compilación.

0

No hay "salida intermedia". El primer resultado que obtienes es código de máquina. (Aunque se puede obtener en C/C++ salida intermedia invocando única el preprocesador con -E.)

4

Así, compilación de ejecutable en GCC consta de 4 partes:

1.) Preprocesamiento (gcc -E main.c> main.i; transforma * .c a * .i) sí incluye la expansión, procesa marcos. Elimina los comentarios.

2.) Compilación (gcc -S main.i; transforma * .i en * .s, si tiene éxito) Compila C-code en Assembler (en la arquitectura x86 de destino es x86-assembly, en arquitectura x86_64 de destino) es x64-assembly, en arquitectura de brazo objetivo es montaje de brazo, etc.) La mayoría de las advertencias y errores ocurren durante esta parte (por ejemplo, informes de error y advertencia)

3.) Assembly (as main.s) o main.o; transforma * .i en * .o, nuevamente si tiene éxito) Conjuntos generados ensamblador a código de máquina. Aunque todavía hay una dirección relativa de los procedimientos, y tal.

4.) Enlace (gcc main.o) Reemplaza direcciones relativas con direcciones absolutas. Elimina el texto inútil. Vinculación de errores y advertencias durante esta fase. Y al final (si tiene éxito), obtenemos un archivo ejecutable.

Por lo tanto, para responder a su pregunta, la salida intermedia que usted quiere decir es en realidad el llamado lenguaje ensamblador - vea wiki sobre eso Assembly language wiki.

+0

Muchas gracias por la respuesta detallada. Esto fue muy útil. – Cemre

+0

¿Debería leer el paso 3 "... transforma * .s a * .o"? – nickgrim

0

La cadena de herramientas GCC, compila el programa desde el código fuente hasta el código de máquina. El compilador genera el código de ensamblaje que el ensamblador ensambla en el código de máquina. Here es un buen tutorial para principiantes.

2

Aquí es una representación gráfica de los pasos de compilación gcc por cortesía de redhat magazine:

gcc compilation steps

Al contrario de lo que otras respuestas implica, no hay paso de montaje - más bien, la generación de código ensamblador sustituye a la generación de código objeto; no tiene mucho sentido convertir una representación en memoria a una de texto si lo que realmente quieres es una representación binaria.

+0

Bueno, sí, no tiene mucho sentido generar mnemónicos, que están destinados a ser leídos por humanos, si va a hacer código objeto de todos modos. Pero los mnemotécnicos son casi 1: 1 con código objeto, y la parte de generación de código del ensamblador _hace_ hecho (calculando direcciones de salto, ese tipo de cosas). – cha0site

Cuestiones relacionadas