2011-12-15 6 views
21

Se si dispone di un semplice programma C, comeEsecuzione di passi di gcc manualmente, la compilazione, l'assemblaggio, che collega

int main(void) {return 0;} 

Può essere compilato con gcc -o test test.c.

Come ho capito, gcc esegue la compilazione, l'assemblaggio e il collegamento. Gli ultimi due passaggi vengono raggiunti eseguendo as e ld.

Posso generare il codice assembly utilizzando gcc -S test.c.

Cosa digiteresti in un terminale per convertire il codice assembly in un file eseguibile?

(la ragione per farlo è quello di imparare il montaggio)

+2

Effettivamente esegue prima la preelaborazione, quindi la compilazione, l'assemblaggio e il collegamento. La preelaborazione può essere una parte non banale del processo, specialmente se usi Boost ... –

+2

Puoi usare il parametro '-v' per vedere come GCC chiama i suoi sottoprogrammi, ad es. 'gcc -o test test.c -v' – mizo

risposta

39

Queste sono le diverse fasi utilizzando gcc

gcc -E --> Preprocessor, but don't compile 
gcc -S --> Compile but don't assemble 
gcc -c --> assemble but don't link 
gcc with no switch will link your object files and generate the executable 
+2

Le versioni correnti di GCC non hanno più un preprocessore separato (puoi chiedere solo la pre-elaborazione come sopra, però) – vonbrand

+0

Bella risposta, peccato che non spieghi troppo – CristiFati

1

Dopo aver fatto gcc -S -o test.s test.c, tipo gcc -o test test.s.

3

gcc test.s -o test compilerà il test da test.s per voi.

potrebbe anche valere il vostro tempo - potrebbe essere più facile/più amichevole di gcc per la compilazione di assemblaggio.

+0

Non proprio. 'gcc' gestisce molta burocrazia dipendente dal sistema per te, in piena compatibilità con il modo in cui gestisce gli altri pezzi del tuo progetto. – vonbrand

0

È possibile avviare gcc e interrompere il processo di compilazione dove desiderato. gcc test.s -o test l'avrà compilato test.s dall'assembly in un file eseguibile.

0

Come si può o non può sapere, le quattro fasi della compilazione sono pre-elaborazione (-E), compilare al montaggio (-S), assemblare a oggetto codice (-c) e infine collegamento. La cosa più difficile da capire è come utilizzare l'output del preprocessore. Ecco come farlo:

gcc -E hello.c | gcc -S -xc -o hello.s - 
gcc -c hello.s -o hello.o 
gcc hello.o -o hello 
Problemi correlati