www.mikrocontroller.net

Forum: Compiler & IDEs AVR-GCC Linker linkt unbenutzte Teile


Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich bin gerade dabei, den Webserver von U. Radig so zu modifizieren, 
dass er mit einer von mir dafür abgeänderten Version von efsl (embedded 
file systems library) läuft und Webseiten von SD_Krate anzeigt.

Ich mache daraus ein Projekt für AVR-Studio, d.h. ich habe alle 
notwendigen Files bereits importiert und efsl benutze ich nicht als 
Bibliothek, sondern direkt den Quellcode.

Nun bin ich gerade an einer merkwürdigen Sache dran. Damit der Code 
möglichst klein wird, habe ich einige Optimierungen im Compiler, unter 
anderem
-ffunction-sections
-fdata-sections

Im Linker entsprechend
-Wl,--relax
-Wl,--gc-sections

Den folgenden Thread habe ich schon dazu gelesen:
Beitrag "AVR-GCC Kompiliert nicht benutzte Funktionen mit ein"

Nun erwarte ich, dass unbenutzte Funktionen nicht mehr gelinkt werden. 
Das ist auch so, aber es wird trotzdem noch RAM dafür reserviert. Warum?

Speziell möchte ich die ganzen #define use_... aus dem Webserver 
ausbauen, ich finde es viel praktischer, die nicht benutzten Funktionen 
einfach nicht aufzurufen, als sie immer speziell per define aus dem 
Projekt auszuschließen.

Das funktioniert auch, aber es wird Ram dafür verbraucht. wol.c (Wake on 
Lan) habe ich jetzt z.B. im Projekt, rufe aber nichts davon auf. Wenn 
ich es per #define vom Compilierungsvorgang ausschließe, benötigt das 
ganze am Ende 4 Byte weniger Ram. Die Codegröße ändert sich aber nicht.

Diese 4Byte entsprechen aber auch nicht den in wol.c deklarierten 
Variablen, die würden viel mehr Speicher benötigen.

Kennt jemand eine Option, mit der der Linker auch den zusätzlichen 
Ram-Verbrauch verhindert?

Grüße,

Peter

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vergleich doch mal die .lss-files der beiden Versionen, um rauszufinden, 
was da die zusätzlichen 4 bytes belegt.

>ich finde es viel praktischer, die nicht benutzten Funktionen
>einfach nicht aufzurufen, als sie immer speziell per define aus dem
>Projekt auszuschließen.

Na ja, ich finde es viel praktischer, schon vorhandene und 
nachgewiesenermaßen funktionierende Verfahren zu benutzen. Was hast du 
gegen #defines?

Oliver

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist einfach so, dass ich mir nicht immer bei Änderungen überlegen 
möchte, welche Module dafür genau benötigt werden und welche nicht. Alle 
verwendeten müsste ich immer per #define einbauen. Dafür sind die 
Optimierungen im Linker ja da, dass unbenutze Teile nicht mitgelinkt 
werden.

Beim Webserver ist das auch nicht so kritisch, aber bei dem Filesystem 
gibt es eine Menge an Funktionen, die ich nie aufrufe aber auch nicht 
per #define auskommentieren möchte.

Natürlich kann man nicht global sagen, dass diese Vorgehensweise 
vorteilhaft ist und es ist auch nicht sicher, dass ich es so lasse. 
Trotzdem interessiert es mich, woher der zusätzliche Speicherbedarf 
kommt.

Das mit den lss files ist etwas kompliziert bei diesem großen Projekt, 
ich werde mir bei Gelegenheit mal ein Minimalbeispiel konstruieren, an 
dem man den Effekt erkennen kann.

Grüße,

Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.