Optimiert der Linker nicht?

OP #560370
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!
#560372
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
OP #560379
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!
Moderator Persönliche Seite #560587
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).

Antwort schreiben

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.

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.