Forum: Mikrocontroller und Digitale Elektronik Wann ist die Option -nostartfiles sinnvoll


von Miracoli (Gast)


Lesenswert?

Hallo zusammen,

ich bin gerade bei Atmel Studio über die Option -nostartfiles 
gestolpert. Zu Testzwecken habe ich diese mal aktiviert und, nachdem ich 
bei der main noch die Attribute
1
naked
 und
1
section(".init8")
hinzugefügt habe scheint auch alles soweit zu funktionieren.
Deswegen meine Frage, was genau macht der startup code und wann kann man 
diesen weglassen und wann nicht.

Viele Grüße

von Jim M. (turboj)


Lesenswert?

Bau mal eine vorbelegte Variable ala
1
int hallo = 1;
2
3
void main(){
4
5
while (1)
6
  printf("Hallo %d \r\n");
7
}

ein. Hint: Es wird das Datensegment initialisiert.

von Miracoli (Gast)


Lesenswert?

Hi,

danke für die schnelle Antwort. D.h. da die meisten Programme ja das 
Datensegment benötigen, hat diese Option nur begrenzten Nutzen, oder 
gibt es ein Beispiel wann sie sinnvoll wäre?

Die beiden Attribute kann man aber gefahrlos benutzen, oder?
Soweit ich verstanden habe gibt naked an, dass kein Funktion-Pro- und 
Epilog erstellt werden soll, was bei einer main mit Endlosschleife ja 
nicht gebraucht wird.
Das Attribut section(".init8") umgeht den Aufruf über rcall, was bei der 
main ja auch nicht gebraucht wird.

Viele Grüße

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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.

: Bearbeitet durch User
Beitrag #5002258 wurde vom Autor gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.