Miracoli schrieb:
> Deswegen meine Frage, was genau macht der startup code und wann kann man
> diesen weglassen und wann nicht.
Zunächst besteht der Startup-Code bei avr-gcc aus 2 Teilen: den einen
liefert die libgcc, den anderen die avr-libc. Mit -nostartfiles wird
nur der Teil der avr-libc weggelassen, also crt*.o.
Den Unterschied siehtst du, wenn du beim Linken -v -Wl,-v mit angibst an
den unterschiedlichen Kommandozeilen, mit denen das Treiberprogramm
avr-gcc den Linker aufruft.
Die Aufteilung des Startup-Codes in libgcc und avr-libc ist teilweise
historisch, teilweise bedingt durch benötigte Device-Information, die
man nicht im Compiler halten will.
libgcc:
- Initialisierung von .bss und COMMON mit 0 vor Aufruf von main.
- Initialisierung von .data und .rodata vor Aufruf von main.
- Aufruf von statischen Konstruktoren vor Aufruf von main.
- Aufruf von statischen Destruktoren und mit atexit registrierter
Funktionen nach dem Verlassen von main.
- Bereitstellung von _exit und einer weak-Definition von exit.
avr-libc:
- Verctor-Tabelle
- Setzen von zero-reg auf 0 vor dem Code der libgcc.
- Initialisierung von SP vor dem Code der libgcc.
- Initialisierung von EIND vor dem Code der libgcc.
- Aufruf von main nach dem Code der libgcc.
- Aufruf von exit nach verlassen von main.
> wann kann man diesen weglassen und wann nicht.
Wenn du ihn nicht brauchst kannst du ihn weglassen.