Etapas Compilacion en C
Etapas Compilacion en C
Etapas Compilacion en C
2
Realizar y documentar la compilacin paso a paso de un programa Hola
Mundo escrito en C.
El proceso de compilacin de un programa escrito en lenguaje C involucra cuatro etapas que se deben
de realizar de forma sucesiva; estas etapas son procesamiento, compilacin, 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 continuacin se realiza la compilacin de un programa, que muestra en pantalla el mensaje Hola
Mundo, llevndolo por cada una de las etapas de la compilacin de forma individual y mostrando los
comandos necesarios para realizar la compilacin de forma exitosa.
El cdigo fuente del programa que se utilizara se muestra a continuacin 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 traduccin 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 lneas: las lneas de cdigo que continan con secuencias de escape de nueva
lnea son unidas para formar lneas lgicas.
3. Tokenizacion: Reemplaza los comentarios por espacios en blanco, divide cada uno de los
elementos a preprocesar por un carcter de separacin.
4. Expansin de macros y gestin de directivas: ejecuta las lneas con directivas de
1. Secuencia de tres caracteres que un lenguaje de programacin trata como uno solo.
preprocesador incluyendo las que incluye otros archivos y las de compilacin condicional.
Adems expande los macros.
En el ejemplo de esta tarea, la fase de preprocesamiento se encargara de reemplaza la lnea #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 cdigo fuente.
El comando para llevar a cabo esta fase seria gcc -E tarea2.c > tarea2.pp
Como resultado de la ejecucin del comando anterior se obtiene el archivo tarea2.pp donde se puede
apreciar que el contenido del archivo stdio.h fue insertado.
Compilacin
La compilacin transforma el cdigo C en el lenguaje ensamblador propio del procesador de la
mquina.
El comando para llevar a cabo esta fase seria gcc -S tarea2.c.
Cdigo fuente de tarea2.c
Cdigo del archivo stdio.h
insertado por la fase de
pre-procesado
Como resultado de la ejecucin del comando anterior se obtiene el archivo tarea2.s en donde el
cdigo fuente fue traducido a lenguaje ensamblador.
Ensamblado
El ensamblado trasforma el programa escrito en lenguaje ensamblador a cdigo 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 ejecucin del comando anterior es el archivo con nombre tarea2.o el cual
contiene el cdigo objeto obtenido a partir del cdigo en lenguaje ensamblador generado en la fase
anterior.
La fase de ensamblado tambin puede llevarse a cabo a partir del archivo con el cdigo en lenguaje
C. para llevar a cabo este proceso directamente se utiliza el siguiente comando gcc c tarea2.c con
el cual tambin se genera el archivo tarea2.o a partir del archivo tarea2.c.
Enlazado
Las funciones de C/C++ incluidas en nuestro cdigo, tal como printf() en el ejemplo, se encuentran
ya compiladas y ensambladas en bibliotecas existentes en el sistema. Es preciso incorporar de algn
modo el cdigo binario de estas funciones a nuestro ejecutable. En esto consiste la etapa de enlace,
donde se renen uno o ms mdulos en cdigo objeto con el cdigo 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 obtencin de un archivo completamente ejecutable
por el SO con el nombre de tarea2
Tambin se puede llevar a cabo el enlazado, de forma no directa, esto haciendo uso de gcc dndole
como entrada el archivo tarea2.o generado anteriormente. El comando para llevar a cabo esta funcin
seria gcc -o circulo circulo.o.
El resultado de llevar a cabo las 4 fases anteriores es la generacin de un ejecutable del programa
escrito en lenguaje C el cual puede ser corrido por el SO. El comando para llevar a cabo la ejecucin seria
./tarea2, obteniendo como resultado la impresin en pantalla del mensaje hola mundo.