Kürzlich habe ich versucht, einige Low-Level-Arbeiten zu debuggen, und ich konnte die nicht finden crt0.S für den Compiler (avr-gcc), aber ich habe eine gefunden crt1.S (und das gleiche mit dem entsprechenden .o Dateien).
Was ist der Unterschied zwischen diesen beiden Dateien? Ist crt1 etwas ganz anderes oder was? Beide scheinen etwas mit “Bootstrapping” zu tun zu haben (Einrichten stack frame und so), aber warum die Unterscheidung?
kriss
Sowohl crt0/crt1 tun dasselbe, tun im Grunde das, was vor dem Aufruf von main() erforderlich ist (wie Stack initialisieren, IRQs setzen usw.). Sie sollten mit dem einen oder anderen verlinken, aber nicht mit beiden. Sie sind nicht wirklich Bibliotheken, sondern wirklich Inline-Assembler-Code.
Soweit ich weiß, gibt es crt in zwei “Geschmacksrichtungen”.
crt1 wird auf Systemen verwendet, die Konstruktoren und Destruktoren unterstützen (Funktionen, die vor und nach main und exit aufgerufen werden). In diesem Fall wird main wie ein normaler Funktionsaufruf behandelt.
crt0 wird auf Systemen verwendet, die keine Konstruktoren/Destruktoren unterstützen.
Was genau sind diese Konstruktoren/Destruktoren? Bezieht sich das auf C++ oder etwas anderes? In meiner Antwort hier Es funktionierte ohne crtbeginT.o und crtend.o das sind die Konstruktoren und Destruktoren.
– Z-Boson
22. Oktober 2014 um 17:59 Uhr
Ich habe es in meiner Antwort geschrieben. Nicht, es ist nicht (direkt) mit C++ verwandt. Es sind Funktionen, die vor main und nach dem Ende des Programms aufgerufen werden müssen. Es hängt mit dem Betriebssystem zusammen, auf dem das Programm ausgeführt wird. Aber ich bin nicht die beste Person, um darüber zu erzählen (ich habe solche Funktionen nie geschrieben, andere haben es getan), und es würde wahrscheinlich eine eigene Antwort verdienen.
– kriss
25. Oktober 2014 um 8:56 Uhr
@kriss, danke für die Antwort. Ich habe es erst jetzt gesehen, weil du @zboson nicht verwendet hast. Der Destruktor wird wirklich nach Exit aufgerufen?
– Z-Boson
14. November 2014 um 10:48 Uhr
13985600cookie-checkcrt0.o und crt1.o – Was ist der Unterschied?yes