Dito:
--------------------
http://www.mikrocontroller.net/articles/AVR-GCC-Codeoptimierung#Unbenutzte_Funktionen_und.2Foder_Variablen_entfernen
Unbenutzte Funktionen und/oder Variablen entfernen
F: Mir ist aufgefallen, dass der Linker nicht benutzte Funktionen
trotzdem mit linkt und Speicherplatz belegt. Gibt es eine Möglichkeit
diese Funktionen automatisch weg zu lassen?
A: Dem GNU Linker sagt man mit --gc-sections, dass er unbenutzte
Sektionen rauswirft. Mit --print-gc-sections listet er die
rausgeworfenen auch auf. Dem GCC kann man mit -ffunction-sections sagen,
dass er jede Funktion in eine eigene Sektion legt, damit funktioniert
das auch unterhalb der Ebene einer Quellcodedatei (also eine Funktion
rausschmeissen obwohl fünf andere in derselben Datei gebraucht werden).
Mit der Option -fdata-sections geht das auch für statische Variablen
(Forumsbeitrag von Andreas B.).
Vorsicht: Je nach Implementierung der Interruptsprung- bzw. Vektorleiste
kann es dazu führen, dass alle eigenen Interrupt-Handler ebenfalls
wegoptimiert werden. Dies passiert dann, wenn es im Code keinen Verweis
(typisch: Ermittlung der Adresse zum Eintrag in eine
Interrupt-Vektortabelle oder in Hardwareregister eines
Interrupt-Controllers) auf die Handler-Funktion gibt oder die Funktion,
in der der Verweis auf eine ISR enthalten ist, nie aufgerufen wird. In
solchen Fällen kann es notwendig sein, die Handler mit
__attribute__((used)) zu versehen. Bei Verwendung der Makros aus der
avr-libc (in WinAVR enthalten, z.B. ISR()) ist dies nicht erforderlich,
da das Attribut bereits in den Makro-Definitionen enthalten ist
(avr-libc/interrupt.h/ __INTR_ATTRS). In manch anderer Umgebung, wie bei
einigen Quellcodes für ARM-basierte Controller, ist das Attribut jedoch
zu ergänzen.