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


von Peter D. (pdiener) Benutzerseite


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

von Oliver (Gast)


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

von Peter D. (pdiener) Benutzerseite


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

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.