crt0 (také známý jako c0 ) je sada spouštěcích rutin vynucených k propojení doprogramu C. Crt0 provede inicializační práci požadovanou před voláním hlavní funkce .
Crt0 má obvykle podobu objektového souboru s názvem crt0.o , často napsaný v jazyce symbolických instrukcí , který je automaticky zahrnut linkerem do každého spustitelného souboru , na který odkazuje [1] .
crt0 obsahuje hlavní části runtime knihovny . Práce, kterou vykonává, závisí na kompilátoru, operačním systému a implementaci standardní knihovny. [1] Kromě inicializační práce vyžadované prostředím a sadou nástrojů může crt0 provádět další operace definované programátorem, jako je spouštění globálních konstruktorů C++ a funkcí C, které mají atribut ((constructor)) .
"crt" znamená "C runtime" a nula znamená "úplně začátek". Když jsou však programy kompilovány pomocí GCC, používá se také v jazycích jiných než C. Pro speciální případy použití jsou k dispozici alternativní verze crt0 ; například, aby bylo možné profilování pomocí gprof, programy musí být zkompilovány pomocí gcrt0 . [2]
Tento příklad je pouze pro Linux x86-64 se syntaxí AT&T bez aktuálního C runtime.
.text .globl_start _ _start: # _start je vstupní bod známý linkeru xor %ebp , %ebp # efektivně RBP := 0, označte konec rámců zásobníku mov ( %rsp ), %edi # získat argc ze zásobníku (implicitně nulově rozšířené na 64-bit) lea 8 ( %rsp ), %rsi # převezme adresu argv ze zásobníku lea 16 ( % rsp , %rdi , 8 ), %rdx # převezme adresu envp ze zásobníku xor %eax , %eax # na ABI a kompatibilita s icc call main # %edi, %rsi, %rdx jsou tři argumenty (z nichž první dva jsou standardní C) k main mov %eax , %edi # přenést návrat hlavního do prvního argumentu _exit xor %eax , %eax # na ABI a kompatibilita s voláním icc _exit # ukončit program