4 gennaio 2011

Compilazione Base di un Sorgente C

Compilare un Sorgente C

Usando Gnu/Linux prima o poi ci si ritrova inevitabilmente(almeno per chi smanetta) ad avere a che fare con il linguaggio C. Tra l'altro era mia intenzione con l' arrivo del nuovo anno di imparare il linguaggio C quindi eccomi qua a scriverne.

Vediamo come compilare un sorgente minimale in C che ci fornisce in output il famosissimo Hello World, con cui hanno avuto a che fare(almeno agli inizi) anche i guru del C.

Apriamo il nostro editor preferito e scriviamo il nostro sorgente che salveremo nel file dal nome hello.c

#include
main ()
{
printf("Hello World\n");
}

poi proseguiamo con la semplice compilazione con gcc hello.c, che crea il file di nome a.out

[archie@fobia ~]$ gcc hello.c
[archie@fobia ~]$ ls
a.out hello.c Modelli Pubblici Scrivania
Documenti Immagini Musica Scaricati Video

che possiamo eseguire con il comando di esecuzione ./a.out, che produce il nostro Hello World a video

[archie@fobia ~]$ ./a.out
Hello World!

mentre usiamo l'opzione -c di gcc per una compilazione intermedia che crea il file oggetto hello.o

[archie@fobia ~]$ gcc -c hello.c
[archie@fobia ~]$ ls
a.out hello.c Immagini Musica Scaricati Video
Documenti hello.o Modelli Pubblici Scrivania

e ne visualizziamo il suo contenuto tramite il comando file


[archie@fobia ~]$ file hello.o
hello.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped


invece se vogliamo creare del codice assembler dal nostro sorgente c, l'opzione -S crea il nostro hello.s che e per l' appunto un file assembler

[archie@fobia ~]$ gcc -S hello.c
[archie@fobia ~]$ ls
a.out hello.c hello.s Modelli Pubblici Scrivania
Documenti hello.o Immagini Musica Scaricati Video

[archie@fobia ~]$ cat hello.s
.file "hello.c"
.section .rodata
.LC0:
.string "Hello World!"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
movl $.LC0, (%esp)
call puts
leave
ret
.size main, .-main
.ident "GCC: (GNU) 4.4.4 20100630 (Red Hat 4.4.4-10)"
.section .note.GNU-stack,"",@progbits


per visualizzare i tempi della compilazione usiamo il comando -time

[archie@fobia ~]$ gcc -time hello.c -o hello.c
# cc1 0.02 0.01
# as 0.00 0.01
# collect2 0.04 0.01
[archie@fobia ~]$

per un resocondo completo di gcc supporto al debug -g, linking ldd, ottimizzazione del codice ON, e molto altro, consiglio di scaricarvi la relativa manualistica in uno dei suoi molteplici formati.

3 gennaio 2011

Verifica dell' OS con sys.platform

Identificare il Sistema Operativo su cui gira l' interprete python, tramite il metodo platform del modulo sys .

Ci sono diversi modi di identificare su quale versione di OS gira l'interprete python:
la versione "classica" sys.platform == "win32" or sys.platform == "dos", oppure sys.platform[:3] == "win", o anche sys.platform.startswith('win')
oppure il nuovo metodo aggiunto nella versione python2.6, dove vediamo un esempio reale.

>>> import sys

>>> sys.getwindowsversion()

(5, 1, 2600, 2, 'Service Pack 3')
>>>

dove stampa una tupla di major e minor built, la piattaforma 2 (nel mio pc xp) con service pack 3.

I codici completi di equivalenza sono:

0 win32 o windows3.1
1 Windows95-Windows98-WindowsME
2 WindowsNT-Windows2000-WindowsXP-x64
3 Windows CE


E il metodo "classico" o il più usato dai programmatori python ovvero sys.platform

import sys
if sys.platform == "win32" or sys.platform == "dos":
print "sistema di casa Microsoft"
print sys.api_version

elif sys.platform == "linux1386" or sys.platform == "linux2":
print "sistema di tipo Gnu/Linux"
print sys.api_version

elif sys.platform == "bsd" or sys.platform == "darwin":
print "sistema di tipo bsd"
print sys.api_version

else:
print " |sistema non riconosciuto!| "

[output]
sistema di casa Microsoft
1013

il metodo platform contiene altri identificatori di piattaforma quali:

cygwin, sunos5, palmOS3, os2, riscos, atheos.

Per approfondire l'argomento non resta che spulciare la meravigliosa Library Reference e il relativo modulo sys con platform.