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!
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
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!
In diesem Zusammenhang ganz nützlich: -ffunction-sections -fdata-sections Voraussetzung: Das Linker-Script bindet die so entstehenden Sections ein.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.