2010-04-25 5 views
27

recientemente He estado tratando de depurar algún trabajo de bajo nivel y no pude encontrar el crt0.S para el compilador (avr-gcc) pero sí encontré un crt1.S (y lo mismo con los archivos .o correspondientes)crt0.o y crt1.o - ¿Cuál es la diferencia?

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

Respuesta

27

Ambos crt0/crt1 hacen lo mismo, básicamente hacen lo que necesitan 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 utiliza en el sistema que soporta constructores y destructores (funciones llamadas antes y después de principal y de salida). En este caso, main se trata como una llamada de función normal.
  • crt0 se usa en sistemas que no admiten constructores/destructores.
+2

+1 http://lists.uclibc.org/pipermail/uclibc/2002-December/025943.html – stacker

+0

¿Qué son exactamente estos constructores/destructores? ¿Esto está relacionado con C++ o algo malo? En mi respuesta aquí Funcionó sin 'crtbeginT.o' y' crtend.o' que son los consructors y los destructores. –

+0

Lo escribí en mi respuesta. No, no está (directamente) relacionado con C++. Son funciones que deben llamarse antes de main y después del final del programa. Está relacionado con el sistema operativo en el que se ejecuta el programa. Pero no soy la mejor persona para contar sobre eso (nunca escribí tales funciones, otros lo hicieron) y probablemente merecería alguna respuesta propia. – kriss

Cuestiones relacionadas