Tutto quello che vuoi sapere su GCC

Nota dall’output sopra del file pre-elaborato che dal momento che il nostro programma ha richiesto lo stdio.h header essere incluso nella nostra fonte che a sua volta, ha richiesto un sacco di altri file di intestazione.

Compilazione

Il passo successivo è prendere il file pre-elaborato come input, compilarlo e produrre un output compilato intermedio. Il file di output per questa fase produce il codice assembly che dipende dalla macchina.

utilizzando l’opzione “-S” bandiera con gcc siamo in grado di convertire il pre-elaborato C codice sorgente in linguaggio assembly, senza la creazione di un file oggetto:

$ gcc -S HelloWorld.i -o HelloWorld.s

File compilato

anche Se io non sono molto in assemblea a livello di programmazione, ma una rapida occhiata conclude che questa assemblea livello di uscita è in una qualche forma di istruzioni assembler in grado di capire e di convertirlo in macchina a livello di lingua.

Assembly

Come tutti sappiamo ,le macchine possono comprendere solo il linguaggio binario, quindi ora abbiamo bisogno di un ASSEMBLATORE che converte il codice assembly in “HelloWorld.c ” file in codice binario.

ASSEMBLER è stato uno dei primi strumenti software sviluppati dopo l’invenzione del computer digitale.

Se ci sono chiamate a funzioni esterne nel codice assembly, l’Assemblatore lascia gli indirizzi delle funzioni esterne indefiniti, da compilare in seguito dal Linker.

L’Assemblatore può essere richiamato come mostrato di seguito. Usando il flag “- c ” in gcc possiamo convertire il codice assembly in codice a livello macchina:

$ gcc -c HelloWorld.c -o HelloWorld.o

HelloWorld.o

L’unica cosa che possiamo spiegare guardando HelloWorld.o file riguarda la stringa ELF nella prima riga. ELF sta per formato eseguibile e collegabile.

Un file oggetto e un file eseguibile sono disponibili in diversi formati come ELF (Eseguibile e formato di collegamento) e COFF (Common Object-File Format). Ad esempio, ELF è utilizzato su sistemi Linux, mentre COFF è utilizzato su sistemi Windows.

Questo è un formato relativamente nuovo per i file oggetto a livello macchina e l’eseguibile prodotti da gcc. Prima di questo, è stato utilizzato un formato noto come a.out. Si dice che ELF sia un formato più sofisticato di a. out (potremmo approfondire il formato ELF in qualche altro articolo futuro).

Se si compila il codice senza specificare il nome del file di output, il file di output prodotto ha il nome ‘a.out’ ma il formato ora è cambiato in ELF. È solo che il nome del file eseguibile predefinito rimane lo stesso.

Collegamento

Questa è la fase finale in cui vengono eseguiti tutti i collegamenti delle chiamate di funzione con le loro definizioni. Linker sa dove sono implementate tutte queste funzioni (Assembler ha lasciato l’indirizzo di tutte le funzioni esterne da chiamare). Fino a questo stadio GCC non conosce la funzione come printf() .L’Assemblatore avrebbe lasciato l’indirizzo delle funzioni da chiamare e il Linker esegue il processo finale di compilazione di questi indirizzi con le definizioni effettive. Il linker fa anche alcune attività aggiuntive per noi. Combina il nostro programma con alcune routine standard necessarie per far funzionare il nostro programma. Quindi la dimensione eseguibile finale è molto più del file di input!

L’intero processo di collegamento viene gestito da gcc e richiamato come segue:

$ gcc -o Output HelloWorld.c

Il comando precedente esegue il file ” HelloWorld.c “e produce il file eseguibile finale “Output”.

elencando tutti i file usando ls-l

Come puoi vedere, il file ‘Output’ è di default un file eseguibile con permessi-rwxrwxr-x ,questo significa solo che ha il permesso eseguibile per tutti gli utenti(proprietario,gruppo e altri). Se si esegue questo file eseguibile semplicemente digitando’./ Output ‘ si ottiene l’output finale del nostro programma !

Output del file eseguibile

Così ora sappiamo come un programma C viene convertito in un eseguibile . Ci immergeremo un po ‘ più in profondità nella programmazione C nei prossimi articoli. Fino ad allora, Felice apprendimento! 🙂

You might also like

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.