Forum: Compiler & IDEs Eclipse und --gc-sections


von Frank L. (franklink)


Lesenswert?

Hallo zusammen,
ich verwende Eclipse, AVR-Toolchain mit WinAVR-20100110

Ich habe hier ein Projekt, das über defines einmal mit und einmal ohne 
Fernbedienungsfunktion kompiliert werden kann.

Ohne Fernbedienungsfunktionen sollte das Ergebnis locker in einen 
ATMEGA48 passen. Die Optionen -ffunction-sections -fdata-sections für 
den Compiler sind gesetzt und werden auch verwendet.

Leider werden nicht alle unnötigen Funktionen entfernt, weil ich nicht 
in der Lage bin die Option --gc-sections an die korrekte Stelle für den 
Linker einzutragen.

Kann mir da jemand Hilfestellung geben?

Gruss
Frank

von Frank L. (franklink)


Lesenswert?

Hallo zusammen,
habs gerade selber gefunden.

Es muss der komplette Text: -Wl,--gc-sections unter AVR-Linker - General 
- Other Arguments eingetragen werden.

Gruss
Frank

von Frank L. (franklink)


Lesenswert?

Nochmals eine Frage dazu, wo kann man diese Optionen eintragen, damit 
sie für alle Projekte automatisch eingetragen werden?

Gruss
Frank

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


Lesenswert?

Frank Link schrieb:
> Ich habe hier ein Projekt, das über defines einmal mit und einmal ohne
> Fernbedienungsfunktion kompiliert werden kann.

Warum schmeißt du dann die ohne Fernbedienungsfunktion nicht nötigen
Funktionen nicht gleich mittels #ifdef auch mit raus?

Manchmal fragt man sich schon, wie es Generationen von C-Programmierern
geschafft haben, solche Sachen ohne Krimskrams wie function sections
und "garbage collection" hinzubekommen.

von Frank L. (franklink)


Lesenswert?

Hallo Jörg,
genau das mache ich ja. Es gibt ein #define WITH_FB wird dieses #define 
auskommentiert, sind alle Teile im Quellcode, die in irgendeiner Weise 
mit den Fernbedienungsfunktionen in Verbindung stehen entfernt. Trotzdem 
ist das Ergebnis immer noch über 5,4 KB groß.

Mit #ifdef entferne ich allerdings nur die Headerdateien und die Teile 
des Quellcodes, der innerhalb meiner eigenen Routinen Funktionen aus den 
ausgeklammerten c-Dateien aufruft.

Hier mal ein Auszug aus meinen Quellen:
1
#include <stdlib.h>
2
#include <avr/interrupt.h>
3
4
#include "define.h"
5
6
#ifdef DEBUG
7
#include "base.h"
8
#include "uart.h"
9
#endif
10
11
#include "timer.h"
12
#include "user.h"
13
#include "TLC5940.h"
14
15
#ifdef WITH_FB
16
#include "irmp.h"
17
#include "wceeprom.h"
18
#endif
19
20
int main( void )
21
{
22
#ifdef DEBUG
23
  uart_init();
24
#endif
25
26
#ifdef WITH_FB
27
  wcEeprom_init();
28
#endif
29
30
  cli();
31
  color_init();
32
  TLC5940_init( 12 );
33
34
#ifdef WITH_FB
35
  irmp_init();
36
  timer_init();
37
  user_init();
38
#endif
39
  sei();
40
41
  while( 1 )
42
  {
43
#ifdef WITH_FB
44
    autoleaveMenuMode();
45
    handle_ir_code();
46
#endif
47
    handle_leds();
48
  }
49
  return 0;
50
}

Ich verwende in meinen Sourcen IRMP. Gehe ich jetzt hin und entferne in 
IRMP verschiedene Protokolle wird das ganze kleiner.

Durch den Einsatz der zusätzlichen Optionen ist das Ergebnis mit 
auskommentierten #define WITH_FB ca. 1,7 KB groß und unter Verwendung 
von #define WITH_FB 6,9 KB groß.

Jetzt stellt sich für mich halt die Frage wieso?

Gruß
Frank

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


Lesenswert?

Frank Link schrieb:
> Mit #ifdef entferne ich allerdings nur die Headerdateien und die Teile
> des Quellcodes, der innerhalb meiner eigenen Routinen Funktionen aus den
> ausgeklammerten c-Dateien aufruft.

Du musst das #ifdef natürlich auch in den C-Dateien selbst drin
haben, also nicht nur die Aufrufe entfernen, sondern auch das
heraus-"ifdefen", was dann nicht mehr aufgerufen wird.

Lediglich bei Bibliotheken würde der Linker nur die Module (nicht
Funktionen) linken, die tatsächlich referenziert werden.  Alle
Objektmodule, die der Linker auf der Kommandozeile außerhalb von
Bibliotheken vorgesetzt bekommt, linkt er immer komplett, denn das
ist ihm ja mit der Kommandozeile so gesagt worden.

von Frank L. (franklink)


Lesenswert?

Alles klar, soweit hatte ich das auch aus anderen Threads heraus gelesen 
und verstanden. Das würde bedeuten, dass ich z.B. in der irmp.c ein 
#define WITH_FB um den kompletten Quellcode setzen müsste, um genau das 
zu erreichen.

Ist es da nicht einfacher, mit den zusätzlichen Optionen zu arbeiten, da 
dies dann automatisch erfolgt? Aus meiner Sicht werden damit Folgefehler 
vermieden. Oder gibt es einen anderen Grund, auf diese Optionen zu 
verzichten? Mal abgesehen davon, dass sie irgendwann vielleicht 
wegfallen könnten.

Gruß
Frank

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


Lesenswert?

Frank Link schrieb:
> Das würde bedeuten, dass ich z.B. in der irmp.c ein
> #define WITH_FB um den kompletten Quellcode setzen müsste, um genau das
> zu erreichen.

Richtig.

> Ist es da nicht einfacher, mit den zusätzlichen Optionen zu arbeiten, da
> dies dann automatisch erfolgt? Aus meiner Sicht werden damit Folgefehler
> vermieden. Oder gibt es einen anderen Grund, auf diese Optionen zu
> verzichten?

Mag sein, dass ich altmodisch bin, aber ich bin der Meinung, dass man
als Programmierer den Überblick behalten sollte und einfach wissen
sollte, in welcher Konfiguration welche Codeteile wirklich benötigt
werden.  Wenn man diesen Überblick aber hat, dann gibt's doch keinen
Grund, dem Compiler die nicht benötigten Dinge überhaupt erst zum
Fraß vorzuwerfen.

(Der wesentliche Grund, warum --gc-sections und -ffunction-sections
wohl überhaupt so weit gekommen sind, ist meiner Erinnerung nach, dass
der Compiler bei C++ zum Teil formal gezwungen ist, bestimmte Dinge
wie Konstruktoren zu generieren, da er selbst noch nicht wissen kann,
ob sie überhaupt jemals benötigt werden.)

von Frank L. (franklink)


Lesenswert?

Hallo Jörg,
das mit dem altmodisch, kann ich voll nachvollziehen, nach fast 30 
Jahren Softwareentwicklung habe ich da auch so meine Marotten :-)

Bei mir ist es leider eher selten, dass ich mit c arbeite, von daher 
habe ich da ab und an kleinere oder auch größere Verständnisprobleme.

Bei mir hat sich eine zweischneidige Denkweise eingebürgert. Routinen, 
die nicht von mir sind und nachgewiesener Maßen das tun, was ich 
erwarte, ändere ich nur ungern. Auf der anderen Seite, will ich das Rad 
auch nicht neu erfinden und verwende dort wo es geht Bibliotheken, die 
nicht von mir sind. Gerade im Mikrocontrollerbereich, wo ich vielen der 
hier Anwesenden nicht das Wasser reichen kann und will. Auch habe ich 
teilweise nicht das Verständnis bzw. den Willen jede einzelne Zeile zu 
verstehen zu müssen.

Von daher sind mir diese Optionen lieber, weil ich nur in meinen Quellen 
die Änderungen vornehmen muss und mir über die Quellen anderer 
zumindestens an dieser Stelle keine Gedanken machen muss.

Leider bleibt meine eigentliche  Frage: "Wo kann man diese Optionen 
generell für alle Projekte in Eclipse eintragen" unbeantwortet. Kannst 
Du mir auch an dieser Stelle noch den entscheidenden Tipp geben?

Gruß
Frank

[EDIT] In Bezug auf die Optionen und C++ hast Du Recht. So hatte ich es 
auch im INet gefunden.

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


Lesenswert?

Frank Link schrieb:
> Kannst
> Du mir auch an dieser Stelle noch den entscheidenden Tipp geben?

Nein, leider nicht, Eclipse ist mir zu schwerfällig.  Ich benutze
einfach Emacs für alles und schreibe meine Makefiles selbst. ;-)

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.