A crt0 (más néven c0 ) olyan indítási rutinok halmaza, amelyeket egy C programhoz kell kapcsolni . A Crt0 elvégzi a szükséges inicializálási munkát a fő függvény meghívása előtt .
A Crt0 általában egy crt0.o nevű objektumfájl formáját ölti , gyakran assembly nyelven írva, és amelyet a linker automatikusan beilleszt minden végrehajtható fájlba, amelyet hivatkozik [1] .
A crt0 tartalmazza a futásidejű könyvtár fő részeit . Az elvégzett munka a fordítótól, az operációs rendszertől és a szabványos könyvtár megvalósításától függ . [1] A környezet és eszközkészlet által megkívánt inicializálási munkákon kívül a crt0 további, a programozó által meghatározott műveleteket is végrehajthat, mint például a C++ globális konstruktorok és a ((constructor)) attribútummal rendelkező C függvények végrehajtása .
A "crt" azt jelenti, hogy "C runtime", a nulla pedig azt, hogy "nagyon kezdődik". Ha azonban a programokat GCC-vel fordítják, akkor nem C nyelveken is használják. Különleges felhasználási esetekre a crt0 alternatív verziói is elérhetők; Például a gprof segítségével történő profilalkotás engedélyezéséhez a programokat a gcrt0 segítségével kell lefordítani . [2]
Ez a példa csak az AT&T szintaxisú Linux x86-64 rendszerre vonatkozik, naprakész C futtatókörnyezet nélkül.
.text .globl_start _ _start: # _start a linker által ismert belépési pont xor %ebp , %ebp # effektíve RBP := 0, jelölje ki a verem keretek végét mov ( %rsp ), %edi # get argc a veremből (implicit zero-extended 64 bitesre) lea 8 ( % rsp ), %rsi # veszi az argv címét a veremből lea 16 ( % rsp , % rdi , 8 ), %rdx # veszi az envp címét a veremből xvagy % eax , %eax # per ABI és kompatibilitás az icc főhívással # %edi, % rsi , %rdx a három arg (ebből az első kettő C szabvány) a mainre mov %eax , %edi # átviszi a main visszatérését az _exit xor %eax , %eax # első argumentumába ABI-nként és az icc hívással való kompatibilitás _exit # fejezi be a programot