PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Linker: region text is full



cumi
21.05.2007, 15:01
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)

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

CsT
21.05.2007, 21:13
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

cumi
21.05.2007, 21:23
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.

m.a.r.v.i.n
21.05.2007, 22:07
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.


# 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.



LIBPATH = ../../lib
LDFLAGS += -L$(LIBPATH)

ogni42
22.05.2007, 13:26
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.

cumi
24.05.2007, 14:03
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).

ogni42
25.05.2007, 19:49
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.