mikrocontroller.net

Forum: Compiler & IDEs Optimiert der Linker nicht?


Autor: Günther Frings (taraquedo)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Günther Frings (taraquedo)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: A.K. (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

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.