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.