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 necesario antes de llamar a la función principal del programa . Una vez que la función principal se completa, el control vuelve a crt0, que llama a la función de biblioteca exit(0) para finalizar el proceso.
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 construye. [1]
crt0 contiene las partes más básicas de la biblioteca de 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. [1] Además del trabajo de inicialización requerido por el entorno y la cadena de herramientas , crt0 puede realizar operaciones adicionales definidas por el programador, como ejecutar constructores globales de C++ y funciones de C que llevan el atributo ((constructor)) de GCC . [2] [3]
"crt" significa "tiempo de ejecución de C" y el cero significa "el comienzo". Sin embargo, cuando se compilan programas con GCC, también se utiliza para lenguajes distintos de C. Existen versiones alternativas de crt0 para escenarios de uso especiales; por ejemplo, para habilitar la creación de perfiles con gprof , los programas deben compilarse con gcrt0 . [4]
Este ejemplo es para Linux x86-64 con sintaxis AT&T , sin un entorno de ejecución C real.
.texto.globl_inicio _start: # _start es el punto de entrada conocido por el enlazador xor %ebp , %ebp # efectivamente RBP: = 0, marca el final de los marcos de pila mov ( %rsp ), %edi # obtiene argc de la pila (implícitamente extendido a cero a 64 bits) lea 8 ( %rsp ), %rsi # toma la dirección de argv de la pila lea 16 ( %rsp , %rdi , 8 ), %rdx # toma la dirección de envp de la pila xor %eax , %eax # por ABI y compatibilidad con icc llame a main # %edi, %rsi, %rdx son los tres argumentos (de los cuales los dos primeros son estándar de C) para main mov %eax , %edi # transfiere el retorno de main al primer argumento de _exit xor %eax , %eax # por ABI y compatibilidad con icc call _exit # finaliza el programa