c gcc linker crt avr-gcc

crt0.o y crt1.o-¿Cuál es la diferencia?



gcc linker (1)

Ambos crt0 / crt1 hacen lo mismo, básicamente hacen lo que se necesita antes de llamar a main () (como la inicialización de la pila, la configuración de irqs, etc.). Debes enlazar con uno u otro, pero no con ambos. No son realmente bibliotecas, sino código ensamblador en línea.

Por lo que yo entiendo, crt viene en dos "sabores"

  • crt1 se usa en sistemas que admiten constructores y destructores (funciones llamadas antes y después de main y exit). En este caso, main se trata como una llamada de función normal.
  • crt0 se usa en sistemas que no admiten constructores / destructores.

Recientemente he estado intentando depurar algún trabajo de bajo nivel y no pude encontrar el crt0.S para el compilador ( avr-gcc ), pero encontré un crt1.S (y lo mismo con los archivos .o correspondientes).

¿Cuál es la diferencia entre estos dos archivos? ¿Es crt1 algo completamente diferente o qué? Ambos parecen tener algo que ver con ''bootstrapping'' (configuración del stack frame y demás), pero ¿por qué la distinción?