[Curso] Introducción a la programación en C (XII)

Moderadores: Kravenbcn, largeroliker, fidelcastro, cerealkiller, pspCaracas, m0skit0, LnD, ka69, zacky06

Responder
Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

[Curso] Introducción a la programación en C (XII)

Mensaje por m0skit0 »

<< Anterior Siguiente >>

"Lo único más peligroso que un técnico hardware con un parche software es un programador con un soldador"

En este capítulo nos vamos a relajar un poco y vamos a intentar comprender cómo funciona el proceso de convertir nuestro código en C a un ejecutable. No os asustéis, que no voy a meterme en detalles, sólo voy a explicar el proceso, qué programas intervienen y qué resultados se obtienen.

Siempre recordad que la máquina sólo ejecuta un código binario denominado lenguaje máquina.

Preprocesador

El preprocesador es un programa que se ejecuta antes que el compilador propiamente dicho. Es el encargado de ejecutar todas las órdenes de preprocesamiento. ¿Cuáles son éstas? Todas las que empiezan por #. Por ahora sólo hemos visto #include, aunque hay bastantes más (#define, #pragma, etc...). El preprocesador realmente no mira ni de reojo al código en C, sólo se encarga de preparar el asunto para que el compilador pueda trabajar sin problemas. Por ejemplo con #include, como su nombre indica, simplemente sustituye esa línea por el contenido del fichero que se menciona (stdio.h, stdlib.h, etc...). Para detener el proceso después del preprocesamiento, podemos usar la opción -E de gcc, lo cual nos volcará en pantalla el preprocesado.

Compilador

El compilador de C, donde el GNU C Compiler (GCC) es el dios, amo y señor (lo siento, no pude reprimirme), procede a traducir el código C a ensamblador. Para detener el proceso tras el paso de C a ensamblador, no tenéis más que añadir la opción -S a gcc.

Ensamblador

El ensamblador (as en el caso de gcc) coge el código ensamblador generado por el compilador y lo ensambla en lo que se llama código objeto. El código objeto es lenguaje máquina puro, pero le faltan las funciones externas (printf(), scanf(), getch(), etc...), aparte del formato de ejecutable de la plataforma en cuestión. Por tanto, aunque es lenguaje máquina, no es ejecutable. Para detener el proceso justo después del ensamblado, usad -c con gcc.

Enlazador

El enlazador (ld en el caso de gcc) es el último paso en la creación de un ejecutable. Este programa procede a crear las llamadas necesarias a las funciones externas, aparte de convertir el código objeto (o varios códigos objetos) en un solo ejecutable dependiente de la plataforma. Con "dependiente de la plataforma" me refiero a que un ejecutable en Linux (ELF) no es un ejecutable Windows (PE), ya que tienen diferentes formatos e información.

Si usamos la opción -save-temps, gcc mantendrá todos los ficheros intermedios que hemos visto más arriba.

A todos estos programas anteriores se les conoce genéricamente como compilador, aunque como hemos visto esto es incorrecto desde un punto de vista técnico.

Ejecutable

Finalmente el resultado es un ejecutable. Los ficheros ejecutables para los SOs modernos contienen un montón de información de cara a su correcta carga y ejecución por parte del sistema operativo, como relocalización, tamaño de pila, tamaño de sección de datos, tamaño de sección de código, llamadas al sistema, librerías dinámicas usadas, etc...

Espero que esto os haya aclarado algunas dudas. Nos vemos en la próxima ;)

<< Anterior Siguiente >>
Imagen

arisma
Habitual
Habitual
Mensajes: 497
Registrado: 18 Sep 2009, 08:41

Re: [Curso] Introducción a la programación en C (XII)

Mensaje por arisma »

Muchas gracias!

Un saludo.

Avatar de Usuario
~Rdavid~
Experto
Experto
Mensajes: 965
Registrado: 12 Nov 2009, 17:29
Ubicación: Costa Rica

Re: [Curso] Introducción a la programación en C (XII)

Mensaje por ~Rdavid~ »

Muchas gracias, espero que sigas con los cursos que son de mucha ayuda :oki:
Imagen

Responder