Compilación de GCC, bajo el capó
Posteado el 24 de mayo de 2023 por admin

¿Qué es un compilador?
Las computadoras solo hablan en unos y ceros, esto quiere decir que solo usan dos valores posibles para almacenar datos, realizar cálculos y todo lo demás, por eso se llama Binario , pero ¿cómo me comunico con mi computadora?
Aquí es cuando entra en juego un compilador, actúa como un puente entre los humanos y las computadoras, traduciendo nuestro lenguaje a código binario para que las computadoras puedan entender el conjunto de instrucciones llamadas programas que escribimos para decirles qué hacer.

¿Qué es CCG?
GNU Compiler Collection GCC para abreviar (anteriormente GNU C Compiler) es un sistema compilador producido por el Proyecto GNU que admite varios lenguajes de programación y es un software 100% gratuito.
¿Qué pasa debajo del capó?
Entonces, ¿qué pasos están involucrados en la compilación de GCC? En pocas palabras, todo el proceso consta de cuatro pasos principales:

Para que comience este proceso, debemos darle al compilador un archivo de código fuente como entrada, por lo que creamos uno con nuestro editor de texto favorito y escribimos un mensaje simple de «Hola, mundo», iré con vim .
vim main.c


Una vez que tengamos nuestro archivo de código fuente, podemos convertirlo en un archivo ejecutable simplemente invocando el comando gcc seguido del nombre del archivo:
gcc principal.c
Pero, como queremos ver qué sucede después de cada etapa, detendremos el proceso usando las siguientes banderas (que van entre el comando y el nombre del archivo):
- -E : Detener después de la etapa de preprocesamiento; no ejecute el compilador correctamente.
- -S : Detener después de la etapa de compilación propiamente dicha; no ensamblar
- -c : compila o ensambla los archivos de origen, pero no los vincula.
- -o <archivo> : coloca la salida en el archivo <archivo> . Esto se aplica independientemente del tipo de salida que se produzca, ya sea un archivo ejecutable, un archivo de objeto, un archivo ensamblador o un código C preprocesado. Si no se especifica -o , el valor predeterminado es colocar un archivo ejecutable en a.out .
- Consulte la página del manual para obtener información detallada.
Ahora veamos cada etapa en detalle:
1. Preprocesamiento
En este paso, el preprocesador realizará tres tareas principales para transformar nuestro programa antes de la compilación real:
- Elimina los comentarios del código, un comentario comienza con un asterisco inclinado /* y termina con un asterisco inclinado */ :
/**
* Autor: Salomón Chambi.
* Finalidad: Mostrar un comentario que será eliminado.
* Idioma: C
*/
- Expande las macros, buscará las directivas #define e implementará las macros que se encuentren en nuestro código fuente.
- Expande los archivos/encabezados incluidos, buscará directivas #include , eliminará la línea y la reemplazará con el contenido del archivo o encabezado.
Para detenernos después de la etapa de preprocesamiento, usamos el comando gcc con su indicador -E seguido del nombre de nuestro archivo main.c , esto nos mostrará el resultado en nuestra pantalla (Tenga en cuenta que también podemos usar un operador de redirección > para enviar la salida a otro archivo):
gcc -E principal.c
Esta etapa genera código expandido, que se ve así :

2. Compilación
Esta es la etapa más compleja porque hace un análisis semántico de nuestro código, lo verifica en busca de errores, elimina el código muerto e inalcanzable , y si especifica un tipo de optimización , lo ejecuta.
Para detenernos después de la etapa de compilación, usamos el comando gcc con su indicador -S seguido del nombre de nuestro archivo main.c , esto nos mostrará la salida en un nuevo archivo autogenerado llamado main.s (Tenga en cuenta que podemos también use un operador de redirección > para enviar la salida a otro archivo):
gcc -S principal.c

Esta etapa genera código ensamblador y si verificamos el archivo main.s , el contenido es un lenguaje intermedio legible por humanos.

3. Montaje
Esta etapa del proceso toma nuestro código ensamblador generado en la última etapa y lo convierte en código objeto o lenguaje de computadora.
Para detenernos después de la etapa de ensamblaje, usamos el comando gcc con su indicador – c seguido del nombre de nuestro archivo main.c , esto nos mostrará la salida en un nuevo archivo autogenerado llamado main.o (Tenga en cuenta que podemos también use un operador de redirección > para enviar la salida a otro archivo):
gcc -c principal.c

Esta etapa genera código objeto y si revisamos el archivo main.o , el contenido es ilegible para los humanos:

4. Vinculación
En esta última etapa, nuestro compilador toma el código objeto generado en la etapa de ensamblaje y lo combina con las bibliotecas que están presentes, también combina otros archivos de objetos generados a partir de otros módulos por nuestros pares.
El resultado final de esta etapa es un archivo ejecutable.
Si gcc se ejecuta sin opciones, el nombre de archivo predeterminado es a.out
gcc principal.c

Pero, si queremos nombrar nuestro archivo ejecutable, debemos agregar el indicador -o seguido de ese nombre y nuestro archivo de código fuente al final:
gcc -o mi ejecutable main.c

Una vez que todo el proceso de compilación haya terminado, podemos ejecutar el archivo ejecutable y obtener nuestro mensaje «Hola, mundo» usando este ‘ ./ ‘ (tenga en cuenta que podemos usar el archivo a.out o el archivo myexecutable ):
