You are on page 1of 14

Del programa en C a sus resultados

Introduccin a la Programacin
Clase 3
Patricia Borensztejn

De un programa C a su carga en
memoria para su ejecucin

Compilar, Enlazar, cargar


Tres procesos deben efectuarse sobre el
programa fuente (hello.c) para que ste pueda
ejecutarse.
Proceso de Compilacin (Compile)
Toma como entrada un archivo fuente (.c)
Saca como salida un archivo objeto (.o)

Proceso de Enlace (Link)


Toma como entrada uno o varios archivos objeto
Saca como salida un archivo ejecutable

Proceso de Carga en memoria (Load)


Toma como entrada un archivo ejecutable
No hay salida

Compilacin
Si no especificamos nada, gcc compila,
ensambla y enlaza, es decir, genera el
ejecutable. A ese conjunto de funciones se
las llama build.
En http://gcc.gnu.org/onlinedocs/gcc4.6.0/gcc/ tenemos un manual on-line de las
opciones de compilacin del gcc

Compilacin sin enlazar: opcin -c


C:\Users\Patricia\programas_c> gcc -c euler1.c
C:\Users\Patricia\programas_c>dir
El volumen de la unidad C no tiene etiqueta.
El nmero de serie del volumen es: 1C16-BCF3
Directorio de C:\Users\Patricia\programas_c
30/03/2011
30/03/2011
25/03/2011
27/03/2011
30/03/2011

08:57 p.m. <DIR>


.
08:57 p.m. <DIR>
..
10:42 a.m.
236 euler1.c
11:47 a.m.
25.126 euler1.exe
08:57 p.m.
610 euler1.o

Compilacin sin ensamblar: opcin -S


C:\Users\Patricia\programas_c> gcc -S euler1.c
C:\Users\Patricia\programas_c>dir
El volumen de la unidad C no tiene etiqueta.
El nmero de serie del volumen es: 1C16-BCF3
Directorio de C:\Users\Patricia\programas_c

30/03/2011 09:41 p.m. <DIR>


.
30/03/2011 09:41 p.m. <DIR>
..
27/03/2011 03:50 p.m.
25.126 euler.exe
25/03/2011 10:42 a.m.
236 euler1.c
27/03/2011 11:47 a.m.
25.126 euler1.exe
30/03/2011 08:57 p.m.
610 euler1.o
30/03/2011 09:41 p.m.
776 euler1.s
5 archivos
51.874 bytes

Programa Hello.s (ensamblador ia32)


.file

"euler1.c"
.def
___main; .scl
.section .rdata,"dr"

2;

.type

32;

.endef

.type

32;

.endef

LC0:
.ascii "El resultado es %d\12\0"
.text
.globl _main
.def
_main; .scl
2;
_main:
pushl
%ebp
movl
%esp, %ebp
andl
$-16, %esp
subl
$32, %esp
call
___main
movl
$0, 24(%esp)
movl
$3, 28(%esp)
jmp
L2

Programa Hello.s (cont)


L5:

L3:
movl
movl
movl
cltd
idivl
movl
testl
je
movl
movl
movl
cltd
idivl
movl
testl
jne

28(%esp), %eax
$3, %edx
%edx, %ecx
%ecx
%edx, %eax
%eax, %eax
L3
28(%esp), %eax
$5, %edx
%edx, %ecx
%ecx
%edx, %eax
%eax, %eax
L4

movl
addl

28(%esp), %eax
%eax, 24(%esp)

incl

28(%esp)

cmpl
jle
movl
movl
movl
call
movl
leave
ret
.def
.type

$999, 28(%esp)
L5
24(%esp), %eax
%eax, 4(%esp)
$LC0, (%esp)
_printf
$0, %eax

L4:
L2:

_printf; .scl
32;
.endef

2;

Etapa de Compilacin
Dos funciones:
Chequeo de sintaxis: independiente de la mquina, solo
depende de la especificacin del lenguaje
Generacin de cdigo mquina: dependiente de la
mquina

Durante la etapa de compilacin estricta (opcin c) si


el compilador encuentra una funcin o variable no
definida, NO da error. Supone que est definida en
algn otro archivo.
Los errores tpicos de compilacin son:
Parntesis sobrantes o faltantes, punto y coma faltante,
llaves mal puestas.

Etapa de enlace
En esta etapa, se unen todos los archivos .o y se
genera un archivo ejecutable, con el formato
definido por el Sistema Operativo en uso.
En windows, los ejecutables tienen extensin .exe
En linux, ninguna extensin.
Errores tpicos de linkedicin o enlace:
Variables no declaradas, funciones no declaradas, o
declaradas varias veces.

Importante
El proceso de compilacin y enlace depende
de la mquina y del sistema operativo.
No hay compatibilidad binaria entre distintas
mquinas (ISAs) y distintos SOs.
Ese es el negocio! Estas atrapado en una
mquina y en un SO y no te podes mover de
ah si no tenes los fuentes de tu programa!!!!!!

Ejecutables
Los formatos de los archivos ejecutables
dependen del Sistema Operativo.
Contienen una cabecera con informacin que
incluye el tamao del cdigo y de los datos, y una
lista de lugares dentro del cdigo que debern ser
reubicadas en funcin de la posicin de memoria
donde el mdulo sea cargado para su ejecucin.
Es decir, el ejecutable contiene posiciones
relativas de datos que deben ser cambiados.

Carga
El SO tiene un programa cuya funcin es instalar
el ejecutable en memoria. Obviamente la
cabecera no se instala, sino que sirve para
modificar el ejecutable.
El lugar de la memoria donde se instala el
programa, lo decide el SO.
Los SO actualmente no instalan TODO el
programa en memoria, sino solo el principio
(donde est el main) luego, van trayendo el
cdigo y los datos a demanda esto se llama
Memoria Virtual y sirve para que quepan mas
cosas en memoria.

Compiladores de C: GNU
GNU : Sistema de software no propietario, de dominio pblico, que est a
libre disposicin en Internet, de forma que cualquiera puede bajarlo,
modificarlo y redistribuirlo. Fue iniciado en 1.984 por Richard Stallman en
el MIT. Dentro de la inmensa cantidad de software que ha generado la
iniciativa, cabe destacar GCC ("GNU C Compiler") que rpidamente se
convirti en un conjunto de compiladores de los lenguajes ms
importantes (C++, Objective-C; Objective-C++; Fortran; Java; Ada; Pascal y
COBOL), por lo que las siglas anteriores pasaron a significar "GNU
Compiler Collection". Los compiladores que la componen tienen a su vez
nombres individuales. Por ejemplo, el de Ada es GNAT, y el de C++ es
conocido como G++. Cabe destacar que todos ellos son compiladores
nativos, en el sentido de que no se trata de preprocesadores que trasladan
el cdigo a otro lenguaje (como ocurra con las versiones originales de
C++), y que existen versiones para los procesadores y mquinas ms
importantes: Intel; DEC; HP; Motorola; PDP; Power PC; SPARC; VAX; etc.

You might also like