crt0 (även känd som c0 ) är en uppsättning startrutiner som tvingas länkas till ett C- program . Crt0 utför initieringsarbetet som krävs innan huvudfunktionen anropas .
Crt0 tar vanligtvis formen av en objektfil som heter crt0.o , ofta skriven på assemblerspråk , som automatiskt inkluderas av länken i varje körbar fil som den länkar [1] .
crt0 innehåller huvuddelarna av runtime-biblioteket . Arbetet det gör beror på kompilatorn, operativsystemet och implementeringen av standardbiblioteket. [1] Utöver initieringsarbetet som krävs av miljön och verktygsuppsättningen, kan crt0 utföra ytterligare operationer definierade av programmeraren, såsom exekvering av C++ globala konstruktörer och C-funktioner som har ((konstruktor)) -attributet .
"crt" betyder "C runtime" och noll betyder "mycket början". Men när program kompileras med GCC används det även på icke-C-språk. Alternativa versioner av crt0 är tillgängliga för speciella användningsfall; till exempel, för att möjliggöra profilering med gprof, måste program kompileras med gcrt0 . [2]
Det här exemplet är endast för Linux x86-64 med AT&T-syntax utan en uppdaterad C-runtime.
.text .globl_start _ _start: # _start är ingångspunkten känd för länkaren xor %ebp , %ebp # effektivt RBP := 0, markera slutet av stack frames mov ( %rsp ), %edi # hämta argc från stacken (implicit noll-förlängd till 64-bitars) lea 8 ( %rsp ), %rsi # ta adressen till argv från stacken lea 16 ( %rsp , %rdi , 8 ), %rdx # ta adressen till envp från stacken xeller %eax , %eax # per ABI och kompatibilitet med icc call main # %edi, %rsi, %rdx är de tre argsna (varav de två första är C-standard) till main mov %eax , %edi # överför returen av main till det första argumentet för _exit xor %eax , %eax # per ABI och kompatibilitet med icc call _exit # avsluta programmet