crt0 - crt0
Esecuzione del programma |
---|
Concetti generali |
Tipi di codice |
Strategie di compilazione |
Tempi di esecuzione notevoli |
|
Compilatori e toolchain notevoli |
|
crt0 (noto anche come c0 ) è un insieme di routine di avvio di esecuzione collegate a unprogramma C che esegue qualsiasi lavoro di inizializzazione richiesto prima di chiamare la funzione principale del programma.
Forma e utilizzo
Crt0 prende generalmente la forma di un file oggetto chiamato crt0.o , spesso scritto in linguaggio assembly , che viene automaticamente incluso dal linker in ogni file eseguibile che costruisce.
crt0 contiene le parti più basilari della libreria runtime . In quanto tale, il lavoro esatto che esegue dipende dal compilatore del programma, dal sistema operativo e dall'implementazione della libreria standard C. Accanto al lavoro inizializzazione necessaria dall'ambiente e toolchain , crt0 può eseguire operazioni aggiuntive definite dal programmatore, ad esempio l'esecuzione C ++ globali costruttori e funzioni C trasportano GCC 's ((costruttore)) attributo.
"crt" sta per "C runtime" e lo zero sta per "l'inizio". Tuttavia, quando i programmi vengono compilati utilizzando GCC, viene utilizzato anche per linguaggi diversi dal C. Sono disponibili versioni alternative di crt0 per scenari di utilizzo speciali; ad esempio, per abilitare la profilazione con gprof , i programmi devono invece essere compilati con gcrt0 .
Esempio crt0.s
Questo esempio è per Linux x86-64 con sintassi AT&T , senza un runtime C effettivo.
.text
.globl _start
_start: # _start is the entry point known to the linker
xor %ebp, %ebp # effectively RBP := 0, mark the end of stack frames
mov (%rsp), %edi # get argc from the stack (implicitly zero-extended to 64-bit)
lea 8(%rsp), %rsi # take the address of argv from the stack
lea 16(%rsp,%rdi,8), %rdx # take the address of envp from the stack
xor %eax, %eax # per ABI and compatibility with icc
call main # %edi, %rsi, %rdx are the three args (of which first two are C standard) to main
mov %eax, %edi # transfer the return of main to the first argument of _exit
xor %eax, %eax # per ABI and compatibility with icc
call _exit # terminate the program