crt0 - crt0

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

Guarda anche

Riferimenti

link esterno