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
Respuesta
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.
+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
@ cha0site: gracias ... veamos; El OP es bienvenido para pedir aclaraciones, en cuyo caso me complacerá expandirme. –
@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
Debe ser un código de ensamblaje. Puede obtenerlo usando el indicador -S
en la línea de comando para la compilación.
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
.)
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.
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.
Aquí es una representación gráfica de los pasos de compilación gcc por cortesía de redhat magazine:
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.
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
- 1. cambiar el tipo de salida de mime en php
- 2. iterador de salida de C++ borrado por tipo
- 3. ¿Cómo personalizo la salida de un tipo personalizado usando printf?
- 4. Interpretación de salida de salida
- 5. de iterador de salida
- 6. Suprimir salida
- 7. ¿Cómo puedo sangrar la salida de salida?
- 8. Detección del tipo de flujo de salida de un script de shell
- 9. Salida XML de MySQL
- 10. Formateo de salida de rastreo
- 11. salida de la aplicación de forma automática sin ningún tipo de advertencia o error
- 12. PHP encabezado de tipo de imagen de salida vs Ubicación redirigir a binario en fs
- 13. Especificar el valor de salida de un tipo de entrada HTML5 = fecha?
- 14. ¿Pasar un tipo de valor en un parámetro de "salida" hace que la variable esté encuadrada?
- 15. "Un proyecto con un tipo de salida de Class Library no se puede iniciar directamente"
- 16. ¿El mejor tipo de salida y prácticas de codificación para las funciones __repr __()?
- 17. Un proyecto con un tipo de salida de Class Library no se puede iniciar directamente
- 18. SQL tipo de datos 'flotar', cuando la salida como XML, provoca resultado de flotación no deseado
- 19. Excel VBA - salida de bucle
- 20. Linux C: salida interactiva
- 21. ¿Por qué ostream_iterator necesita declarar explícitamente el tipo de objetos a la salida?
- 22. salida de redirección de DOS si hay salida
- 23. conseguir el estado de salida y la salida de shell_exec()
- 24. Subproceso de Python. Salida de salida y asíncrona
- 25. Casting C# parámetros de salida?
- 26. Entrada/salida vs salida en Ada
- 27. Tipo de parámetro Tipo de
- 28. GC aclaración de salida
- 29. salida de True y []
- 30. MVVM - Confirmación de salida
¿Qué 'intermedio' de salida quiere decir? 'g ++' genera ensamblaje directamente. – Lol4t0
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. –
Esta no es una pregunta básica en absoluto. – cha0site