"Mi estilo es el arte de luchar, sin luchar"
"Teniendo la no limitacion como limite" Bruce Lee

Jugando con GCC

2008-11-12 10:01:01-06

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


Comments Comentblogs:
1.- Pelón de Jarras wrote:

Muy interesante aporte vendaval, y además excelente aporte.

2008-11-12 11:10:03-06
2.- Pelón de Jarras wrote:

¿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
3.- vendaval wrote:

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
4.- aarkerio wrote:

Yo creo que el filtro quitó las < >.

Es decir al inicio es :

#include <stdio.h>

2010-01-24 10:01:42-06
New Comentblog
Captcha Image
Login




Join us!
Forgot your password?
vendaval
Alberto Rodriguez Sanchez Estudiante de Ingenieria en Computación en la UAM-A, programo en C, C++, C#, Python, Scheme, PHP,y Haskell. Uso Archlinux, Debian GNU/Linux, Mac OS X, OpenSolaris, NetBSD, FreeBSD, Plan9 y Win2. Pienso especializarme en computo científico y criptografía, que son mis grandes pasiones.

También pienso que la programación computacional es un Arte y que muchos programas son elegantes, muchos exquisitos, muchos son brillantes. Mi pensar es que se pueden escribir grandes programas, programas nobles y programas verdaderamente magníficos,por ello prefiero la Sintaxis Avanzada en los programas por que muestra un dominio del lenguaje y un buen grado de abstracción.

FreeBSD, C, Enlightenment y VI(M); son mis SO, Lenguaje de programación, manejador de ventanas y editor favoritos.

Practico Kali Filipino, Limalama y JKD (soy seguidor de la filosofía de Bruce Lee). Ademas soy el guardian la Sexta Casa del Zodiaco y también escribo con cierta regularidad en este blog.

"Se como el agua, piensa como el fuego"
Powered by
Despabilando la MonoNeurona.org
Livechat
<-Nombre

wrote:

on 17/1/10

wrote:
que parsante
on 17/1/10

Puro Hueso wrote:
chistosito
on 8/10/09

vendaval wrote:
ok, =)
on 5/10/09

Puro Hueso wrote:
salgo a las 2, no creo que te quede (mejor quedate a ver viejas)
on 5/10/09

vendaval wrote:
Soul-Tlamaqui -> http://callix.azc.uam.mx/soul
on 1/10/09

rik wrote:
:P soul-tralmakui tiene página? :P
on 1/10/09

vendaval wrote:
207202346 recuerda
on 26/9/09

puro hueso wrote:
me urge que me llames
on 21/8/09

eVa wrote:
Hola mi querido Betux :) ya no lo he visto en línea, ya conectese no? Un beso!
on 20/8/09


@aarkerio: no puedo cambiar mi css. =(
47 minutes ago
y que onda, ya llego la lap o no?
10 hours, 54 minutes ago
LOL
1 week ago
Seguro usas gnome, yo por eso fluxbox...donde todas las pendejadas que suceden son por mi culpa
1 week, 2 days ago
Entonces estas estrenando lap aarkerio??
1 week, 5 days ago
Pues hay que poner tema y fecha.
2 weeks, 1 day ago
Campus Party ...Igual el próximo Año. =(
3 weeks ago
@asarch: malo para el hígado.
3 weeks, 1 day ago
Peleando con un X-gdb
3 weeks, 1 day ago
Creo que algo cambio: http://www.scribd.co m/doc/35539144/pnp12 pt
3 weeks, 3 days ago
Mis Albums
FirefoxjEdit.orgGimpOpenOffice.orgHacker
Top
Colectivo MonoNeurona.org © 2002-2010.