Forum: Compiler & IDEs Optimiert der Linker nicht?


von Günther F. (taraquedo)


Lesenswert?

Hallo!

Ich hatte mal gelernt, dass der Linker Funktionen wegläßt, wenn diese 
nicht benutzt werden. Also ich schreibe hier gerade den Bootloader und 
da kommt es auf jedes Byte an. Trotzdem würde ich gerne einen Header aus 
meinem Hauptprojekt benutzen, der allerlei SD-Funktionen bereitstellt. 
Davon nutzt mein Bootloader nur eine.

Sobald ich allerdings die Dateien dem Projekt hinzufüge scheinen die 
auch eingebunden und erzeugt zu werden. Zumindest ist meine Codegröße 
gleich um ~2000 Byte gewachsen. Von 1200 Byte.

Die Optimierung steht auf Os und ich nutze std=gnu99. Macht er das immer 
so? Wie kann ich das Einbinden der nicht genutzten Funktionen 
verhindern? Muss ich jetzt alles #if #endif- Umklammern?

Grüße!

von Peter D. (peda)


Lesenswert?

Günther Frings wrote:

> da kommt es auf jedes Byte an. Trotzdem würde ich gerne einen Header aus
> meinem Hauptprojekt benutzen, der allerlei SD-Funktionen bereitstellt.

Ein Header stört nicht, er erzeugt genau 0 Byte an Code.

Wenn er allerdings Funktionen deklariert, die alle im gleichen Objekt 
stehen, dann kann der Linker auch nur das gesamte Objekt linken.

Deshalb sind in Bibliotheken üblicher Weise viele kleine Objekte 
zusammengefaßt und die kann dann der Linker auswählen.


Peter

von Günther F. (taraquedo)


Lesenswert?

Hi!

> Deshalb sind in Bibliotheken üblicher Weise viele kleine Objekte
> zusammengefaßt und die kann dann der Linker auswählen.

Also wäre es klug, wenn ich die Funktionen, die ich brauche ausgliedere 
in eine Kombination aus sagen wird sd_fkt_boot.h und sd_fkt_boot.c. Dann 
macht der Compiler daraus eine kleinere sd_fkt_boot.o, die im Bootloader 
Platz hat und im großen Projekt habe ich dann zusätzlich noch eine 
sd_fkt.o.

Grüße!

von A.K. (Gast)


Lesenswert?

In diesem Zusammenhang ganz nützlich: -ffunction-sections 
-fdata-sections
Voraussetzung: Das Linker-Script bindet die so entstehenden Sections 
ein.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

A.K. wrote:

> In diesem Zusammenhang ganz nützlich: -ffunction-sections

Hat aber nur mit der Linkeroption --gc-sections wirklich einen Effekt.
Hier wiederum sollte man genau gucken, dass da nicht zu viel
weggeschmissen wird (ISRs zum Beispiel, oder Startup-Code).

Sinnvoll wäre es, den großen Klumpen in kleine Blöcke aufzuteilen,
die pro Datei nur zusammengehörige Funktionen enthalten.  Es genügt
ja, trotzdem ein einzige Headerdatei für alle Deklarationen zu haben.
Danach compiliert man die Dateien einzeln und legt sie in einer
Bibliothek ab (Endung .a).  Diese wird beim Linken mit angegeben, und
aus dieser nimmt sich der Linker auch nur die Objektmodule (nicht
Funktionen, Module!), die er benötigt.

So ungefähr funktioniert auch die Systembibliothek (libc.a).

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.