Вы находитесь на странице: 1из 11

El compilador GCC GCC es un compilador integrado del proyecto GNU para C, C++, Objective C y Fortran; es capaz de recibir un programa

fuente en cualquiera de estos lenguajes y generar un programa ejecutable binario en el lenguaje de la mquina donde ha de correr.

La sigla GCC significa "GNU Compiler Collection". Originalmente significaba "GNU C Compiler"; todava se usa GCC para designar una compilacin en C. G++ refiere a una compilacin en C++. Sintaxis. gcc [ opcin | archivo ] ... g++ [ opcin | archivo ] ... Las opciones van precedidas de un guin, como es habitual en UNIX, pero las opciones en s pueden tener varias letras; no pueden agruparse varias opciones tras un mismo guin. Algunas opciones requieren despus un nombre de archivo o directorio, otras no. Finalmente, pueden darse varios nombres de archivo a incluir en el proceso de compilacin.

Opciones. -c realiza preprocesamiento y compilacin, obteniento el archivo en cdigo objeto; no realiza el enlazado. -E realiza solamente el preprocesamiento, enviando el resultado a la salida estndar. -o archivo indica el nombre del archivo de salida, cualesquiera sean las etapas cumplidas. -Iruta especifica la ruta hacia el directorio donde se encuentran los archivos marcados para incluir en el programa fuente. No lleva espacio entre la I y la ruta, as: -I/usr/include -L especifica la ruta hacia el directorio donde se encuentran los archivos de biblioteca con el cdigo objeto de las funciones referenciadas en el programa fuente. No lleva espacio entre la L y la ruta, as: -L/usr/lib -Wall muestra todos los mensajes de error y advertencia del compilador, incluso algunos cuestionables pero en definitiva fciles de evitar escribiendo el cdigo con cuidado. -g incluye en el ejecutable generado la informacin necesaria para poder rastrear los errores usando un depurador, tal como GDB (GNU Debugger). -v

muestra los comandos ejecutados en cada etapa de compilacin y la versin del compilador. Es un informe muy detallado. Etapas de compilacin. El proceso de compilacin involucra cuatro etapas sucesivas: preprocesamiento, compilacin, ensamblado y enlazado. Para pasar de un programa fuente escrito por un humano a un archivo ejecutable es necesario realizar estas cuatro etapas en forma sucesiva. Los comandos gcc y g++ son capaces de realizar todo el proceso de una sola vez.

1. Preprocesado. En esta etapa se interpretan las directivas al preprocesador. Entre otras cosas, las variables inicializadas con #define son sustitudas en el cdigo por su valor en todos los lugares donde aparece su nombre. 2. Compilacin.

La compilacin transforma el cdigo C en el lenguaje ensamblador propio del procesador de nuestra mquina. $ gcc -S circulo.c realiza las dos primeras etapas creando el archivo circulo.s; examinndolo con $ more circulo.s puede verse el programa en lenguaje ensamblador.

3. Ensamblado. El ensamblado transforma el programa escrito en lenguaje ensamblador a cdigo objeto, un archivo binario en lenguaje de mquina ejecutable por el procesador.

El ensamblador se denomina as:

$ as -o circulo.o circulo.s crea el archivo en cdigo objeto circulo.o a partir del archivo en lenguaje ensamblador circulo.s. No es frecuente realizar slo el ensamblado; lo usual es realizar todas las etapas anteriores hasta obtener el cdigo objeto as: $ gcc -c circulo.c donde se crea el archivo circulo.o a partir de circulo.c. Puede verificarse el tipo de archivo usando el comando

$ file circulo.o circulo.o: ELF 32-bit LSB relocatable, Intel 80386, version 1, not stripped En los programas extensos, donde se escriben muchos archivos fuente en cdigo C, es muy frecuente usar gcc o g++ con la opcin -c para compilar cada archivo fuente por separado, y luego enlazar todos los mdulos objeto creados. Estas operaciones se automatizan colocndolas en un archivo llamado makefile, interpretable por el comando make, quien se ocupa de realizar las actualizaciones mnimas necesarias toda vez que se modifica alguna porcin de cdigo en cualquiera de los archivos fuente.

4. Enlazado

Las funciones de C/C++ includas en nuestro cdigo, tal como printf() en el ejemplo, se encuentran ya compiladas y ensambladas en bibliotecas existentes en el sistema. Es preciso incorporar de algn modo el cdigo binario de estas funciones a nuestro ejecutable. En esto consiste la etapa de enlace, donde se renen uno o ms mdulos en cdigo objeto con el cdigo existente en las bibliotecas. El enlazador se denomina ld. El comando para enlazar $ ld -o circulo circulo.o -lc ld: warning: cannot find entry symbol _start; defaulting to 08048184 da este error por falta de referencias. Es necesario escribir algo como $ ld -o circulo /usr/lib/gcc-lib/i386-linux/2.95.2/collect2 -m elf_i386 -dynamic-linker /lib/ldlinux.so.2 -o circulo /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc-lib/i386-linux/2.95.2/crtbegin.o L/usr/lib/gcc-lib/i386-linux/2.95.2 circulo.o -lgcc -lc -lgcc /usr/lib/gcc-lib/i386linux/2.95.2/crtend.o /usr/lib/crtn.o para obtener un ejecutable. El uso directo del enlazador ld es muy poco frecuente. En su lugar suele proveerse a gcc los cdigos objeto directamente: $ gcc -o circulo circulo.o crea el ejecutable circulo, que invocado por su nombre $ ./circulo Circulo. Area de circulo radio 10: 314.160004 da el resultado mostrado.

Todo en un solo paso.

En programa con un nico archivo fuente todo el proceso anterior puede hacerse en un solo paso: $ gcc -o circulo circulo.c

No se crea el archivo circulo.o; el cdigo objeto intermedio se crea y destruye sin verlo el operador, pero el programa ejecutable aparece all y funciona. Es instructivo usar la opcin -v de gcc para obtener un informe detallado de todos los pasos de compilacin: $ gcc -v -o circulo circulo.c

Enlace dinmico y esttico.

Existen dos modos de realizar el enlace:

- esttico: los binarios de las funciones se incorporan al cdigo binario de nuestro ejecutable.

- dinmico: el cdigo de las funciones permanece en la biblioteca; nuestro ejecutable cargar en memoria la biblioteca y ejecutar la parte de cdigo correspondiente en el momento de correr el programa. El enlazado dinmico permite crear un ejecutable ms chico, pero requiere disponible el acceso a las bibliotecas en el momento de correr el programa. El enlazado esttico crea un programa autnomo, pero al precio de agrandar el tamao del ejecutable binario. Ejemplo de enlazado esttico: $ gcc -static -o circulo circulo.c $ ls -l circulo -rwxr-xr-x 1 victor victor 237321 ago 4 11:24 circulo Si no se especifica -static el enlazado es dinmico por defecto. Ejemplo de enlazado dinmico: $ gcc -o circulo circulo.c $ ls -l circulo -rwxr-xr-x 1 victor victor 4828 ago 4 11:26 circulo Notar la diferencia en tamao del ejecutable compilado esttica o dinmicamente. Los valores pueden diferir en algo de los mostrados; dependen de la plataforma y la versin del compilador. El comando ldd muestra las dependencias de bibliotecas compartidas que tiene un ejecutable: $ gcc -o circulo circulo.c $ ldd circulo

libc.so.6 => /lib/libc.so.6 (0x40017000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) $ gcc -static -o circulo circulo.c $ ldd circulo statically linked (ELF) La compilacin esttica no muestra ninguna dependencia de biblioteca.

DEPURADOR GDB GDB es el source debugger de GNU. Es un poderoso debugger que permite "ver" que esta sucediendo dentro de programas escritos en C, C++ y Modula-2. Entre las capacidades ms notorias que este debugger posee estn: Debugging de programas complejos con mltiples archivos. Capacidad para detener el programa o ejecutar un comando en un punto especfico (breakpoints), segn una condicin (watchpoints) o al llegar un signal (catchpoints). Capacidad para mostrar valores de expresiones cuando el programa se detiene automticamente (displays). Es posible examinar la memoria y/o variables de diversas formas y tipos, incluyendo estructuras, arreglos y objetos. Es posible igualmente cambiar los valores de las variables para estudiar el comportamiento del programa sin necesidad de recompilar. Posibilidad de realizar debugging a programas en ejecucin (procesos). Posibilidad de realizar debugging a programas que han finalizado. Mltiples formas de entrar al debugger.

Invocacin del Debugger El debugger se puede ejecutar de una de las siguientes formas: $ gdb para entrar al modo interactivo. $ gdb programa para cargar el programa y entrar en el modo interactivo. El programa no comienza hasta que sea indicado con un comando. $ gdb programa core para realizar debugging de un programa que ha finalizado con un 'core'. El debugger carga el programa y su ambiente exactamente como termin. til para verificar por que un programa termino mal o para ver donde un programa se colg (usando CTRL-\ para cortar el programa y obtener un core).

$ gdb programa pid para depurar un programa en ejecucin con el pid indicado. El proceso se detiene y el debugger lo controla en otro terminal. Sumamente til para depurar programas con interfaz desde otro terminal virtual. Una vez que se entra al modo interactivo. GDB acepta comandos hasta que se le indique que se desea salir con el comando 'quit'. La presin de ENTER solo en una lnea siempre invoca el ltimo comando introducido.

Comandos ms frecuentemente usados: Los comandos ms frecuentemente usados son: list [archivo:]funcion list [archivo:]linea[,linea] list list para listar el fuente a partir de una funcin o una lnea. 'list' solo continua el listado previo (page down). 'list -' lista las lneas anteriores (page up). break [archivo:]funcin break [archivo:]lnea para colocar un breakpoint al comienzo de la funcin o al comienzo de la lnea indicada. run [argumentos] para comenzar la ejecucin del programa desde el principio. Los argumentos son los pasados al ejecutable. bt (backtrace) para mostrar el stack del programa, indicando las funciones invocadas y en que lugares fueron llamadas. print expr para mostrar el valor de una expresin. c para continuar la ejecucin del programa despus de que ha sido detenido con un signal o un breakpoint.

next ejecuta la prxima lnea del programa sin entrar dentro de las funciones. Se puede aprovechar el hecho que GDB repite el ltimo comando con ENTER para ejecutar varias lneas seguidas. step ejecuta la prxima lnea del programa entrando en funciones. Se puede aprovechar el hecho que GDB repite el ltimo comando con ENTER para ejecutar varias lneas seguidas. jump linea salta los comandos siguientes y comienza la ejecucin a partir de 'lnea'. til para continuar un programa que ha terminado con 'core', arreglando la situacin y saltando las lneas defectuosas. help [item] ayuda en lnea. quit sale de GDB.

Uso de breakpoints, watchpoints y catchpoints. Breakpoints son puntos donde el programa se detiene cuando pasa por ellos. Watchpoints son expresiones que detienen el programa cuando el valor cambia. Catchpoints son breakpoints sobre signals. Los comandos son como siguen: break [archivo:]funcin break [archivo:]lnea para colocar un breakpoint al comienzo de la funcin o al comienzo de la lnea indicada. tbreak [archivo:]lnea tbreak [archivo:]funcin igual que break, pero el breakpoint es valido por una sola vez. til para crear breakpoints temporales. watch expr se habilita un watchpoint cuando la expresin <expr> cambia.

catch se colocan breakpoints en todos los handlers de excepciones del contexto actual. info break info watch muestra los watchpoints o breakpoints habilitados. info catch indica si se estn interceptando las excepciones. clear lnea clear funcin para eliminar un breakpoint de la lnea indicada. Ver delete para eliminar breakpoints por numero. delete numero para eliminar un breakpoint por numero. El numero puede verse con info break. disable breakpoint enable breakpoint para habilitar o deshabilitar temporalmente un breakpoint. A diferencia de delete no se pierde la referencia de la lnea donde se encuentra, simplemente es ignorado. condition breakpoint [expr] para hacer que un breakpoint sea condicional. Es decir, solo se habilita si la expresin <expr> es cierta. Como <breakpoint> se debe pasar el numero del breakpoint. Si <expr> no se especifica se hace el breakpoint incondicional. ignore breakpoint [count] ignora <count> pasadas sobre el breakpoint <breakpoint>. Examinando y cambiando los datos. GDB ofrece comandos para manipular los datos. Entre estos estn: whatis variable indica de que tipo es la variable. ptype tipo imprime la definicion del tipo indicado.

print [/fmt] expr imprime la expresin. /fmt es un indicador de formato (ver x). Para print el formato solo puede estar compuesto por una letra de cambio de tipo. set variable=expresin cambia el valor de una variable al resultado de la expresin. display [/fmt] expr habilita un display continuo durante debugging de la expresin indicada. Cada vez que el programa se detiene se hace un print [/fmt] de la expr. Se pueden tener varios displays a la vez. Con delete se pueden eliminar displays y con enable y disable se pueden habilitar y deshabilitar igual que como si fueran breakpoints. undisplay numero. equivalente a delete de un display: destruye un display. x [/fmt] address examinar memoria. /fmt es un indicador opcional formado por '/', seguido de un numero (contador), seguido de una letra de formato, seguido de una letra de tamao. Las letras de formato son: o octal f float x hexadecimal a address d decimal u unsigned decimal t binary s string c char las letras de tamao son: b byte h halfword w word g giant (8 bytes) El contador indica cuantos elementos imprimir, asi: x /10xb arreglo imprime los 10 siguientes bytes del arreglo en hexadecimal.

Manipulando el Stack. Los comandos para manipular el stack permiten cambiar y/o examinar variables que se encuentran en otros contextos al local. Es posible verificar el contenido de todas las variables automticas en el stack. Los comandos son: frame [N] selecciona el frame N y lo imprime. Sin argumento el comando indica donde se est actualmente (i.e. frame actual).

bt [N] para ver el contenido del stack. Si se especifica un numero positivo se ven los N primeras entradas en el stack y un numero negativo se ven las ultimas N. select-frame # se selecciona el frame number indicado (el numero lo da el comando bt). El cambiar de frame permite ver o cambiar las variables sobre el stack. No desapila ni empila ningn nuevo frame. Up para ir al frame inmediatamente superior (i.e. la rutina que llamo a la actual). Down para ir al frame inmediatamente inferior. Return para forzar el desapilamiento del frame actual.

Вам также может понравиться