crt0.o et crt1.o – Quelle est la différence?

cemment, j’ai essayé de déboguer un travail de bas niveau et je ne pouvais pas trouver le crt0.S pour le compilateur ( avr-gcc ) mais j’ai trouvé un crt1.S (et la même chose avec les fichiers .o correspondants).

Quelle est la différence entre ces deux fichiers? Est-ce que crt1 est complètement différent ou quoi? Ils semblent tous les deux avoir quelque chose à voir avec “l’amorce” (configuration d’un stack frame ), mais pourquoi cette distinction?

Les deux crt0 / crt1 font la même chose, font essentiellement ce qui est nécessaire avant d’appeler main () (comme initialiser une stack, définir des irq, etc.). Vous devriez créer un lien avec l’un ou l’autre, mais pas les deux. Ce ne sont pas vraiment des bibliothèques, mais un code d’assemblage réellement intégré.

Autant que je sache, crt se décline en deux “saveurs”

  • crt1 est utilisé sur les systèmes prenant en charge les constructeurs et les destructeurs (fonctions appelées avant et après main et exit). Dans ce cas, main est traité comme un appel de fonction normal.
  • crt0 est utilisé sur des systèmes qui ne prennent pas en charge les constructeurs / destructeurs.