Tarea No.

2
Realizar y documentar la compilación paso a paso de un programa Hola
Mundo escrito en C.
El proceso de compilación de un programa escrito en lenguaje C involucra cuatro etapas que se deben
de realizar de forma sucesiva; estas etapas son procesamiento, compilación, ensamblado y enlazado.
Para poder obtener un archivo ejecutable del programa escrito en alto nivel por el programador es
necesario pasar el programa fuente por estas cuatro etapas de forma sucesiva, aunque existen
diferentes opciones que realizan todo el proceso de una sola vez.
A continuación se realiza la compilación de un programa, que muestra en pantalla el mensaje “Hola
Mundo”, llevándolo por cada una de las etapas de la compilación de forma individual y mostrando los
comandos necesarios para realizar la compilación de forma exitosa.
El código fuente del programa que se utilizara se muestra a continuación y este será guardado con el
nombre de tarea2.c:

Preprocesado
El preprocesado es el primer programa invocado por el compilador y se encarga de procesar
directivas tales como #include, #define, y #if.
El preprocesado está dividido en cuatro etapas denominadas fases de traducción y estas son:
1. Tokenizado lexico: esta fase se encarga de reemplazar las secuencias de trigafos
1
por los
caracteres que representan.
2. Empalmado de líneas: las líneas de código que continúan con secuencias de escape de nueva
línea son unidas para formar líneas lógicas.
3. Tokenizacion: Reemplaza los comentarios por espacios en blanco, divide cada uno de los
elementos a preprocesar por un carácter de separación.
4. Expansión de macros y gestión de directivas: ejecuta las líneas con directivas de

1. Secuencia de tres caracteres que un lenguaje de programación trata como uno solo.
preprocesador incluyendo las que incluye otros archivos y las de compilación condicional.
Además expande los macros.
En el ejemplo de esta tarea, la fase de preprocesamiento se encargaría de reemplaza la línea #include
<stdio.h> por el contenido completo del archivo 'stdio.h'. Para llevar a cabo esta fase se debe de
ingresar a una consola y ubicarse en donde se encuentra guardado el archivo del programa que contiene
el código fuente.
El comando para llevar a cabo esta fase seria “gcc -E tarea2.c > tarea2.pp”

Como resultado de la ejecución del comando anterior se obtiene el archivo tarea2.pp donde se puede
apreciar que el contenido del archivo ‘stdio.h’ fue insertado.

Compilación
La compilación transforma el código C en el lenguaje ensamblador propio del procesador de la
máquina.
El comando para llevar a cabo esta fase seria “gcc -S tarea2.c”.
Código fuente de tarea2.c
Código del archivo stdio.h
insertado por la fase de
pre-procesado

Como resultado de la ejecución del comando anterior se obtiene el archivo tarea2.s en donde el
código fuente fue traducido a lenguaje ensamblador.


Ensamblado
El ensamblado trasforma el programa escrito en lenguaje ensamblador a código objeto, un archivo
binario en lenguaje de maquina ejecutable por el procesador.
Para este ejemplo utilizaremos el ensamblador denominado as, teniendo en cuenta que este
recibirá como entrada el archivo creado en la fase anterior el cual fue creado con el nombre de
“tarea2.c”. El comando para llevar a cabo esta fase seria “as –o tarea2.o tarea2.s”



El resultado de la ejecución del comando anterior es el archivo con nombre tarea2.o el cual
contiene el código objeto obtenido a partir del código en lenguaje ensamblador generado en la fase
anterior.

La fase de ensamblado también puede llevarse a cabo a partir del archivo con el código en lenguaje
C. para llevar a cabo este proceso directamente se utiliza el siguiente comando “gcc –c tarea2.c” con
el cual también se genera el archivo tarea2.o a partir del archivo tarea2.c.

Enlazado
Las funciones de C/C++ incluidas en nuestro código, tal como printf() en el ejemplo, se encuentran
ya compiladas y ensambladas en bibliotecas existentes en el sistema. Es preciso incorporar de algún
modo el código binario de estas funciones a nuestro ejecutable. En esto consiste la etapa de enlace,
donde se reúnen uno o más módulos en código objeto con el código existente en las bibliotecas.
El enlazador se denomina ld, el comando para enlazar seria “ld -o circulo circulo.o -lc”. Esto nos
producirá el siguiente error.
“ld: warning: cannot find entry symbol _start; defaulting to 08048184”
Da este error por falta de referencias. Es necesario escribir el comando completo:
“ld -o circulo /usr/lib/gcc-lib/i386-linux/2.95.2/collect2 -m elf_i386 -dynamic-linker /lib/ld-
linux.so.2 -o circulo /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc-lib/i386-linux/2.95.2/crtbegin.o -
L/usr/lib/gcc-lib/i386-linux/2.95.2 circulo.o -lgcc -lc -lgcc /usr/lib/gcc-lib/i386-
linux/2.95.2/crtend.o /usr/lib/crtn.o”

El resultado de ejecutar el comando anterior será la obtención de un archivo completamente ejecutable
por el SO con el nombre de tarea2

También se puede llevar a cabo el enlazado, de forma no directa, esto haciendo uso de gcc dándole
como entrada el archivo tarea2.o generado anteriormente. El comando para llevar a cabo esta función
seria “gcc -o circulo circulo.o”.

El resultado de llevar a cabo las 4 fases anteriores es la generación de un ejecutable del programa
escrito en lenguaje C el cual puede ser corrido por el SO. El comando para llevar a cabo la ejecución seria
“./tarea2”, obteniendo como resultado la impresión en pantalla del mensaje “hola mundo”.