crt0 - crt0
Ejecución del programa |
---|
Conceptos generales |
Tipos de codigo |
Estrategias de compilación |
Tiempos de ejecución notables |
|
Compiladores y cadenas de herramientas notables |
|
crt0 (también conocido como c0 ) es un conjunto de rutinas de inicio de ejecución vinculadas a unprograma C que realiza cualquier trabajo de inicialización requerido antes de llamar a la función principal del programa.
Forma y uso
Crt0 generalmente toma la forma de un archivo objeto llamado crt0.o , a menudo escrito en lenguaje ensamblador , que el enlazador incluye automáticamente en cada archivo ejecutable que crea.
crt0 contiene las partes más básicas de la biblioteca en tiempo de ejecución . Como tal, el trabajo exacto que realiza depende del compilador del programa, el sistema operativo y la implementación de la biblioteca estándar de C. Al lado de la trabajo de inicialización requerido por el medio ambiente y la cadena de herramientas , crt0 puede realizar operaciones adicionales definidos por el programador, tales como la ejecución de C ++ globales constructores y funciones de C que lleva GCC 's () constructor () atributo.
"crt" significa "C runtime", y el cero significa "el comienzo mismo". Sin embargo, cuando los programas se compilan usando GCC, también se usa para lenguajes distintos de C. Hay versiones alternativas de crt0 disponibles para escenarios de uso especiales; por ejemplo, para habilitar la creación de perfiles con gprof , los programas deben compilarse con gcrt0 en su lugar.
Ejemplo crt0.s
Este ejemplo es para Linux x86-64 con sintaxis de AT&T , sin un tiempo de ejecución de C real.
.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