Linker: region text is full
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
Liste der Anhänge anzeigen (Anzahl: 1)
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)