Wann ist die Option -nostartfiles sinnvoll

Gast #5001943
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
Gast #5002010
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
Persönliche Seite #5002038
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.
Beitrag #5002258 wurde von einem Moderator gelöscht.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.