crt0 - crt0
Programmausführung |
---|
Allgemeine Konzepte |
Codearten |
Kompilierungsstrategien |
Bemerkenswerte Laufzeiten |
|
Bemerkenswerte Compiler und Toolchains |
|
crt0 (auch bekannt als c0 ) ist ein Satz von Startroutinen für die Ausführung, die mit einem C- Programm verknüpft sind undalle erforderlichen Initialisierungsarbeitenausführen, bevor die Hauptfunktion des Programms aufgerufen wird .
Form und Verwendung
Crt0 hat im Allgemeinen die Form einer Objektdatei namens crt0.o , die oft in Assembler geschrieben ist und vom Linker automatisch in jede von ihm erstellte ausführbare Datei eingefügt wird .
crt0 enthält die grundlegendsten Teile der Laufzeitbibliothek . Daher hängt die genaue Arbeit, die es verrichtet, vom Compiler, dem Betriebssystem und der Implementierung der C-Standardbibliothek des Programms ab . Neben der Arbeit der Initialisierung durch die Umwelt und die erforderlichen Werkzeugkette , crt0 kann zusätzliche Operationen durch den Programmierer, wie die Ausführung definiert auszuführen C ++ globale Konstruktoren und C Funktionen tragen GCC ‚s ((Konstruktor)) Attribut.
„crt“ steht für „C-Laufzeit“ und die Null steht für „ganz am Anfang“. Wenn Programme mit GCC kompiliert werden, wird es jedoch auch für andere Sprachen als C verwendet. Für spezielle Anwendungsszenarien stehen alternative Versionen von crt0 zur Verfügung; Um beispielsweise die Profilerstellung mit gprof zu aktivieren , müssen Programme stattdessen mit gcrt0 kompiliert werden.
Beispiel crt0.s
Dieses Beispiel gilt für Linux x86-64 mit AT&T-Syntax , ohne eine tatsächliche C-Laufzeit.
.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