crt0 - crt0
Wykonanie programu |
---|
Pojęcia ogólne |
Rodzaje kodu |
Strategie kompilacji |
Godne uwagi czasy pracy |
|
Wybitne kompilatory i łańcuchy narzędzi |
|
crt0 (znany również jako c0 ) to zestaw procedur uruchamiania wykonania połączonych zprogramem w C , który wykonuje wszelkie czynności inicjalizacji wymagane przed wywołaniem głównej funkcji programu .
Forma i zastosowanie
Crt0 generalnie przyjmuje postać pliku obiektowego o nazwie crt0.o , często napisanego w języku asemblera , który jest automatycznie dołączany przez linker do każdego pliku wykonywalnego, który buduje.
crt0 zawiera najbardziej podstawowe części biblioteki wykonawczej . W związku z tym dokładna praca, którą wykonuje, zależy od kompilatora programu, systemu operacyjnego i implementacji standardowej biblioteki C. Przy inicjalizacji praca wymagana przez środowisko i zestawu narzędziowego , crt0 może wykonywać dodatkowe operacje określone przez programistów, takich jak wykonywanie C ++ globalne konstruktorów i funkcje C niosące GCC „S ((konstruktora)) atrybutu.
„crt” oznacza „C runtime”, a zero oznacza „sam początek”. Jednak gdy programy są kompilowane przy użyciu GCC, jest ono również używane dla języków innych niż C. Alternatywne wersje crt0 są dostępne dla specjalnych scenariuszy użycia; na przykład, aby włączyć profilowanie za pomocą gprof , programy muszą być skompilowane za pomocą gcrt0 .
Przykład crt0.s
Ten przykład dotyczy systemu Linux x86-64 ze składnią AT&T , bez rzeczywistego środowiska wykonawczego C.
.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