Jugando con GCC
Software
Pensemos en un pequeño programa llamado "hola Mononeurones" en el lenguaje de programacion C.
#include
int main(){
printf("Hola Mononeurones\n");
return 0;
}
Lo guardamos como "hola.c" ,ya en nuestra shell consentida
gcc -v hola.c hola
Ejecutamos con
./hola
Nos mostrara los pasos realizados para la compilacion
gcc -E hola.c -o hola.i
Nos entregara un archivo en C "Puro", es decir con el codigo que se ha incluido. Puedes ver el cambio con un less hola.i
gcc -S hola.c -o hola.a
Nos entregara un archivo en el lenguaje ensamblador particular de nuestra maquina, puedes verlo con less hola.a
gcc -c hola.c -o hola.o
Este paso nos entrega un archivo en lenguaje maquina, para observarlo de una forma adecuada usamos "od" que nos traduce un archivo a un formato prederminado.
od -c hola.o
od -x hola.o
La primera nos traduce a caracteres ASCII el archivo hola.o, el segundo nos muestra el archvo en formato en hexadecimal (Mas informacion man od), tal vez lo interesante de la primera es que nos permite distingir parte del "Header" ELF (Executable and linkable Format), la primera columna nos muestra la direccion de memoria en la que esta cada instruccion del programa. Sin embargo, este todavia no es un archivo ejecutable, falta enlazarlo, esto permite ligar este archivo con el de "printf" para crear el ejecutable, esa es la razon por la que printf solo aparece como llamada a subrutina y no esta definida en el ensamblador.
El enlazado es un porceso interesante y gcc permite dos opciones:
El enlazado dinamico, que es el default y es que usamos en estas pruebas, liga nuestro codigo a las bibliotecas usadas por medio de su direccion de memoria, esto tiene la ventaja de que si tenemos N programas que usan la misma biblioteca, esta biblioteca solo se carge una vez en memoria, es el sistema operativo el que se encarga de cuidar este proceso.
El enlazado estatico incluye la biblioteca dentro del ejecutable, los ejecutables son mas grandes y no es posible compartir la biblioteca con otros programas en memoria, aunque tiene la ventaja de que puede ser portado a otros sistemas (Que acepten ELF, claro esta) o incluso en maquinas que no tengan un sistema operativo.
El enlace estatico se realiza de la siguiente forma
gcc --static hola.c -o hola2
Ejecutamos asi:
./hola2
Lo interesante seria ver las diferencias entre los dos, les dejo una
ls -l
Notaron la diferencia de tamaños?? sigan jugando con gcc, otra cosa muy interesante es que gcc es un compilador cruzado (cross compiler) y no hay problema con crear ejecutables para otras arquitecturas distintas a la nuestra.
Permalink: http://mononeurona.org/entries/view/vendaval/1645
Comentblogs:Muy interesante aporte vendaval, y además excelente aporte.
2008-11-12 11:10:03-06
¿Entonces el que gcc sea un compilador cruzado implica que puedo aprender a programar ensamblador de ppc o de sparc aún sin tener una máquina con esa arquitectura?
2008-11-13 09:19:09-06
ummm, si, pero no uses bibliotecas o compilarlo con ligado estático para que puedas ver el código completo. checa el man de gcc.
2008-11-13 22:52:58-06
Yo creo que el filtro quitó las < >.
Es decir al inicio es :
#include <stdio.h>
2010-01-24 10:01:42-06










