-
        

Ergebnis 1 bis 7 von 7

Thema: Linker: region text is full

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.10.2005
    Ort
    Zürich
    Beiträge
    117

    Linker: region text is full

    Anzeige

    Hallo Zusammen

    Naja der Titel ist nicht super, ich weiss. Es geht um folgendes: Also der Compiler kopiliert ja alle Funktionen eines Moduls und schrieb diese in eine Object file (*.o). Nun linkt der Linker doch diese Funktionen dann zu einem "aneinanderhängenden" Code zusammen und schaut das die CPU dann für die richtige Funktion auch an den richtigen Ort springt. Ich dachte immer, dass dabei die Funktionen, welche nirgends aufgerufen werden im map-file (der Ausgange vom Linker) gar nirgends erscheint und folglich später nicht in das zu übertragende hex-File kommen.

    Leider bringt der Linker trotzdem folgende Fehlermeldung, auch wenn die verwendeten Funktionen Platz hätten. (Einfacher Test: Ich kompiliere ein Projekt, welches zb. in die 8kb des ATmega8 passen. Dann schreibe ich irgendwo noch eine lange Funktion rein, rufe diese jedoch nirgens auf. Dann kommt auch diese Fehlermeldung)
    Code:
    Building target: avr_main
    Invoking: GCC C Linker
    avr-gcc -mmcu=atmega8 -Wl,-Map,avr.map -o"avr_main"  ./_eeprom.o ./_i2c.o ./_string.o ./comm.o ./gsmapi.o ./gsmhw.o ./gsmtools.o ./gsmuart.o ./i2c_debug.o ./main.o ./out.o ./parse.o ./ram.o ./wait.o   
    /usr/local/avr/lib/gcc/avr/4.0.3/../../../../avr/bin/ld: region text is full (avr_main section .text)
    make: *** [avr_main] Error 1
    make: Target `all' not remade because of errors.
    Build complete for project m8
    Was gibt es für Lösungen für dieses Problem?

    Ich habe Module, welche ich in verschiedenen Projete verwende jedoch nicht immer alle Funktionen brauche. Jetzt fressen mir die Funktionen, welche ich nicht brauche trotzdem Programmspeicher.

    Vielen Dank für eure Hilfe!
    cumi

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    24.09.2006
    Beiträge
    84
    Ich kann gerade nicht testen .. aber wo schreibst du die nicht verwendete Funktion denn rein? In die selbe Quellcode-Datei wie eine der Funktionen, die verwendet wird? Wenn ja, schonmal probiert in eine andere "frische" Quellcode-Datei die ungenutzte Funktion zu schreiben? Funktioniert es dann evtl.?

    Viele Grüße
    CsT

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.10.2005
    Ort
    Zürich
    Beiträge
    117
    danke für deine Antwort.
    Ich hab das gleich einmal ausprobiert. Sogar wenn ich ein neues c-File anlege, in welchem überhaupt keine Funktion verwendet wird tritt der Fehler auf.

    Und auch wenn er dan nicht auftreten würde brächte das nicht sehr viel, da es ja darum geht, dass die Funktionen, welche einfach in einer library drin sind, aber nid verwendet werden keinen Speicherplatz schlucken.

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hi,

    da hilft wohl nur aus den ganzen Files eine Objekt Library zu basteln und mit deinen Projekten zu linken. Dann werden die Funktionen eines Files nur noch eingebunden wenn eine oder mehrere Funktionen daraus verwendet werden.

    Bei der Asuro Lib wird das z.B. so gemacht.
    Hier mal als Anhang das entsprechenden Makefile für die Library vom Asuro.

    Zum Einbinden in deine Projekte mußt du dann im Projekt Makefile die Library linken. Siehe letzte Zeile.
    Code:
    # Additional libraries
    #
    # Minimalistic printf version
    #LDFLAGS += -Wl,-u,vfprintf -lprintf_min
    #
    # Floating point printf version (requires -lm below)
    #LDFLAGS +=  -Wl,-u,vfprintf -lprintf_flt
    #
    # -lm = math library
    LDFLAGS += -lm
    LDFLAGS += -lasuro
    Die erzeugte Lib muß dazu ins AVR Lib Verzeichnis kopiert werden, oder du muß den Pfad zur Lib mit angeben.

    Code:
    LIBPATH = ../../lib
    LDFLAGS += -L$(LIBPATH)
    Angehängte Dateien Angehängte Dateien

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    50
    Beiträge
    1.195
    Der GCC linker linkt ALLE Funktionen einer Datei, auch wenn aus dieser Datei nur eine Funktion benutzt wird.

    Abhilfe geht nur, wenn Du das in mehrere .c-Dateien aufteilst, die dann separat gelinkt werden.

    Den minimalen Codesize bekommst Du dann, wenn pro Funktion eine .c-Datei existiert. Das macht aber in der Regel wenig Sinn, da bestimmte Funktionen ja zusammen gehören. Daher solltest Du pro logisch zusammen hängendem Block (z.B. Navigation, Odometrie, ...) eine Datei anlegen.

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.10.2005
    Ort
    Zürich
    Beiträge
    117
    viele dank für deine antwort, ogni42!
    Grundsätzlich habe ich das auch so gemacht. Ich habe aber zB. ein File mit ganz vielen Funktionen drin, welche irgendwas mit Strings anstellen. Dies verwende ich für verschiedene Projekte. Aber so wie es aussieht muss ich daraus wohl eine Library basteln. Das Problem dabei ist nur, dass mir eclipse bis jetzt alle Make-Files generiert hat und ich weiss nicht wie ich diese ändern kann, denn diese werden ja immerwieder neu generiert (Änderungen gehen also sofort wieder verloren).

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    50
    Beiträge
    1.195
    Ich kenne jetzt das CDT von Eclipse nicht so gut, aber ein ANT Build sollte, wenn Du nach und nach einzelne Dateien anlegst und die Funktionen in diese Dateien auslagerst, das automatisch machen.

    Speicht: Du legst eine neue .c-Datei an, kopierst dann eine Funktion aus der "großen" DAtei da rein und löschst die Funktion in der großen Datei. Den Rest macht dann (hoffentlich) ANT.

    Ansonsten kannst Du Dir selbst ein Makefile schreiben, es gibt - insbesondere im Linux-Kernel - da schöne Beispiele, die eine beliebige Menge von .c-Dateien in .o-Übersetzen und alle .o zu einem executable oder einer lib linken.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •