You are on page 1of 6

Programacin en C/El proceso de compilacin

Programacin en C/El proceso de compilacin


Normalmente, a la hora de programar no creamos un nico archivo C .c, sino varios de ellos conteniendo diferentes funciones del programa. Esto nos proporciona varias ventajas: una mejor organizacin del cdigo, una mejor modularidad y, sobre todo, ms facilidad (y velocidad) a la hora de compilar. El proceso de compilacin que hemos tratado hasta ahora se divide en realidad en dos etapas, que el compilador nos esconde en una: compilacin propiamente dicha y enlazado. En la primera etapa, la de compilacin, nuestro cdigo en C se transforma en cdigo objeto, es decir, cdigo mquina (instrucciones que el ordenador puede ejecutar) en ficheros .o, mientras que en la segunda etapa (enlazado) estos ficheros objeto son unidos entre s para formar el fichero ejecutable (normalmente sin extensin en el mundo Unix, o con extensin .com o .exe en el mundo MS-DOS/Windows). De esta manera, si no hemos modificado el fichero .c que se compila a un determinado fichero .o podemos ahorrarnos esa parte de la compilacin cuando hagamos un cambio en otra parte del programa. Adems tenemos los archivos de cabecera .h, que utilizamos para definir parmetros que se utilizan en el cdigo (caso del fuente1.h del ejemplo) o para definir todas las funciones que vamos a utilizar en todos los archivos .c (caso del cabeceras.h), ya que si recordamos, las funciones (como todo en C) deben definirse antes de usarse, y es posible que estn en otro fichero, lo cual nunca es considerado por el compilador como "antes". Hay que tener en cuenta que el fichero en el que se encuentra la funcin main() llama, necesariamente, a todos los dems ficheros .c, directa o indirectamente, ya que de lo contrario lo que tendramos en esos ficheros sera perfectamente intil. Si tpicamente compilaramos el ejemplo con $ gcc -o programa fuente1.c fuente2.c fuente3.c para realizar esta compilacin por pasos, stos seran: $ $ $ $ gcc gcc gcc gcc -c -c -c -o fuente1.c fuente2.c fuente3.c programa fuente1.o fuente2.o fuente3.o #crea #crea #crea #crea fuente1.o fuente2.o fuente3.o programa

ya que la opcin -c del compilador lo que le dice es que detenga el proceso antes de enlazar, creando los ficheros .o necesarios.

Los pasos del proceso


Lo primero que le ocurre a un fichero .c de cdigo C es el preprocesado. En este paso se sustituyen todas las macros y se eliminan los comentarios. El resultado, si lo vemos independientemente, es un fichero de cdigo C preprocesado, o .i. El segundo paso es la compilacin propiamente dicha, en el que el cdigo C preprocesado se convierte en cdigo ensamblador, que si lo vemos independientemente es un fichero .s. El tercer paso es el ensamblado del cdigo ensamblador, lo que lo convierte en cdigo mquina. Un fichero de cdigo mquina tambin es llamado fichero objeto, y su extensin tpica es .o. Dado que el camino anterior normalmente convierte un fichero en un fichero, se suele hacer en un slo paso, de cdigo C a fichero objeto. El ltimo paso es el enlazado de los ficheros objeto en el ejecutable final.

Programacin en C/El proceso de compilacin

Ejemplos
Tomemos el cdigo C ms simple posible: int main(void) /*Ejemplo*/ { return(0); } Al preprocesarlo tendremos: # 1 "prueba.c" # 1 "<built-in>" # 1 "<command line>" # 1 "prueba.c" int main(void) { return(0); } Vemos que el comentario ha desaparecido. En su lugar aparecen comentarios especficos del preprocesador. Al compilarlo tenemos: .file "prueba.c" .text .globl main .type main, @function main: pushl %ebp movl %esp, %ebp subl $8, %esp andl $-16, %esp movl $0, %eax addl $15, %eax addl $15, %eax shrl $4, %eax sall $4, %eax subl %eax, %esp movl $0, %eax leave ret .size main, .-main .ident "GCC: (GNU) 4.0.3 20051023 (prerelease) (Debian 4.0.2-3)" .section .note.GNU-stack,"",@progbits Un precioso cdigo ensamblador que enseguida convertimos en un ilegible cdigo mquina: ELF4( U)GCC: (GNU) 4.0.3 20051023 (prerelease) (Debian 4.0.2-3) .symtab.strtab.shstrtab.text.data.bss.comment.note.GNU-stack4#!XX,X95E@ #prueba.cmain

Programacin en C/El proceso de compilacin Ese cdigo mquina es el fichero .o que normalmente obtenemos directamente del cdigo C. Finalmente, ese cdigo objeto es enlazado con las libreras necesarias para formar un ejecutable: uUttPTRhhQVhhUSQ[t X[U=t+n_used__libc_start_mainGLIBC_2.0$ii hU)UWVS [ )Eu [^_]&1G;}r [^_]'UWVS

[ )EHt41G9}uD

[^_]USRtCuX[]USP[VX[$ Hp \ Y o$ooGCC: (GNU) 4.0.2 (Debian 4.0.2-2)GCC: (GNU) 4.0.2 (Debian 4.0.2-2)GCC: (GNU) 4.0.3 20051023 (prerelease) (Debian 4.0.2-3)GCC: (GNU) 4.0.3 20051023 (prerelease) (Debian 4.0.2-3)GCC: (GNU) 4.0.2 (Debian 4.0.2-2)GCC: (GNU) 4.0.3 20051023 (prerelease) (Debian 4.0.2-3)GCC: (GNU) 4.0.2 (Debian 4.0.2-2)",\

$$q!y_IO_stdin_used../sysdeps/i386/elf/start.S/ space/debian/glibc/build-area/glibc-2.3.5/ build-tree/glibc-2.3.5/csuGNU AS 2.16.1XF}xgMint\}nOV|/space/debian/glibc/build-area/glibc-2.3.5/ build-tree/i386-libc/csu/crti.S/space/debian/glibc/build-area/glibc-2.3.5/build-tree/glib csuGNU AS 2.16.1f(/space/debian/glibc/build-area/glibc-2.3.5/ build-tree/i386-libc/csu/crtn.S/space/debian/glibc/build-area/ glibc-2.3.5/build-tree/glibc-2.3.5/csuGNU AS 2.16.1%

>

>

Programacin en C/El proceso de compilacin

4:

I?

T/ ../sysdeps/i386/elfstart.S01:"VWYX init.c^ /space/debian/glibc/build-area/glibc-2.3.5/build-tree/i386-libc/csucrti.S3,W\#,: ,Wdd,,W^ /space/debian/glibc/build-area/glibc-2.3.5/build-tree/i386-libc/csucrtn.Sq /space/debian/glibc /build-area/glibc-2.3.5/build-tree/glibc-2.3.5/csuinit.cshort intlong long intunsigned charlong long unsigned intshort unsigned int_IO_stdin_usedGNU C 4.0.2 (Debian 4.0.2-2) .symtab.strtab.shstrtab.interp.note.ABI-tag.hash.dynsym.dynstr.gnu.version. gnu.version_r.rel.dyn.rel.plt.init.text.fini.rodata.eh_ frame.ctors.dtors.jcr.dynamic.got.got.plt.data.bss.comment. debug_aranges.debug_pubnames.debug_ info.debug_abbrev.debug_line.debug_str#(( 1HH(7

ppP?YGo To$$ c lD LL u\\ptt0{ 7p%} v 0: '|`!5 (Hp$L \ t -: r` #*7X M Tc

f@

G\

dph# call_gmon_start__CTOR_LIST____DTOR_LIST____JCR_LIST__ completed.4463p.4462__do_global_dtors_auxframe_dummy__CTOR_

Programacin en C/El proceso de compilacin

END____DTOR_END____FRAME_END____JCR_END____do_global_ctors_aux_DYNAMIC__ fini_array_end__fini_array_start__init_array_ end_GLOBAL_OFFSET_TABLE___init_array_start_fp_hw__dso_handle__libc_csu_fini_init_start__l __libc_start_main@@GLIBC_2.0data_start_fini_edata_end_IO_stdin_used__data_start_Jv_Regist

Fuentes y contribuyentes del artculo

Fuentes y contribuyentes del artculo


Programacin en C/El proceso de compilacin Fuente: http://es.wikibooks.org/w/index.php?oldid=142589 Contribuyentes: Envite, 7 ediciones annimas

Licencia
Creative Commons Attribution-Share Alike 3.0 Unported //creativecommons.org/licenses/by-sa/3.0/

You might also like