Como se ejecuta un programa

Anuncio
Del programa en C a sus resultados
Introducción a la Programación
Clase 3
Patricia Borensztejn
De un programa C a su carga en
memoria para su ejecución
Compilar, Enlazar, cargar
• Tres procesos deben efectuarse sobre el
programa fuente (hello.c) para que éste pueda
ejecutarse.
– Proceso de Compilación (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
Compilación
• 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 compilación del gcc
Compilación sin enlazar: opción -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 número 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
Compilación sin ensamblar: opción -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 número 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 Compilación
• Dos funciones:
– Chequeo de sintaxis: independiente de la máquina, solo
depende de la especificación del lenguaje
– Generación de código máquina: dependiente de la
máquina
• Durante la etapa de compilación estricta (opción –c) si
el compilador encuentra una función o variable no
definida, NO da error. Supone que está definida en
algún otro archivo.
• Los errores típicos de compilación son:
– Paréntesis 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 extensión .exe
• En linux, ninguna extensión.
• Errores típicos de linkedición o enlace:
– Variables no declaradas, funciones no declaradas, o
declaradas varias veces.
Importante
• El proceso de compilación y enlace depende
de la máquina y del sistema operativo.
• No hay compatibilidad binaria entre distintas
máquinas (ISA´s) y distintos SO´s.
• Ese es el negocio! Estas atrapado en una
máquina 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 información que
incluye el tamaño del código y de los datos, y una
lista de lugares dentro del código que deberán ser
reubicadas en función de la posición de memoria
donde el módulo sea cargado para su ejecución.
Es decir, el ejecutable contiene posiciones
relativas de datos que deben ser cambiados.
Carga
• El SO tiene un programa cuya función 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
código 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 público, que está a
libre disposición 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 rápidamente se
convirtió en un conjunto de compiladores de los lenguajes más
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 código a otro lenguaje (como ocurría con las versiones originales de
C++), y que existen versiones para los procesadores y máquinas más
importantes: Intel; DEC; HP; Motorola; PDP; Power PC; SPARC; VAX; etc.
Descargar