2010-04-25 21 views
27

di recente ho cercato di eseguire il debug di alcuni lavori di basso livello e non ho trovato il crt0.S per il compilatore (avr-gcc) ma ho trovato un crt1.S (e lo stesso con i file corrispondenti .o)crt0.o e crt1.o - Qual è la differenza?

Qual è la differenza tra questi due file? Crt1 è qualcosa di completamente diverso o cosa? Entrambi sembrano avere a che fare con qualcosa per il bootstrap (impostazione dello stack frame e così via), ma perché la distinzione?

risposta

27

Entrambi crt0/crt1 fanno la stessa cosa, in pratica fanno ciò che è necessario prima di chiamare main() (come stack di inizializzazione, impostazione di irqs, ecc.). Dovresti collegare l'uno o l'altro ma non entrambi. Non sono realmente librerie ma codice di assemblaggio veramente in linea.

Per quanto ho capito, crt è disponibile in due "gusti"

  • CRT1 viene utilizzato sul sistema che supporta costruttori e distruttori (funzioni chiamate prima e dopo principale e uscita). In questo caso, main viene trattato come una normale chiamata di funzione.
  • crt0 viene utilizzato su sistemi che non supportano costruttori/distruttori.
+2

+1 http://lists.uclibc.org/pipermail/uclibc/2002-December/025943.html – stacker

+0

Quali sono esattamente questi costruttori/distruttori? Questo è legato al C++ o qualcosa di simile? Nella mia risposta qui ha funzionato senza 'crtbeginT.o' e' crtend.o' che sono i costruttori e i distruttori. –

+0

L'ho scritto nella mia risposta. Non è (direttamente) correlato a C++. Sono le funzioni che devono essere chiamate prima di main e dopo la fine del programma. È correlato al sistema operativo su cui è in esecuzione il programma. Ma io non sono la persona migliore per raccontarlo (non ho mai scritto tali funzioni, altri lo hanno fatto) e probabilmente meriterebbe qualche risposta. – kriss