Forum: Mikrocontroller und Digitale Elektronik AVR GCC .text is full - ld scripts finden


von Watch (Gast)


Lesenswert?

Hallo,

ich habe das Problem, dass der Linker mir mitteilt, dass die Region Text 
voll ist.
1
/usr/lib/gcc/avr/4.8.2/../../../avr/bin/ld: main.elf section `.text' will not fit in region `text'
2
/usr/lib/gcc/avr/4.8.2/../../../avr/bin/ld: region `text' overflowed by 16 bytes
3
collect2: error: ld returned 1 exit status

Nun ist der Speicher des AVR aber längst noch nicht voll, wie diese 
Ausgabe beim kompillieren kurz vor der Änderung belegt:
1
AVR Memory Usage
2
----------------
3
Device: atmega328p
4
5
Program:    9488 bytes (29.0% Full)
6
(.text + .data + .bootloader)
7
8
Data:       1675 bytes (81.8% Full)
9
(.data + .bss + .noinit)
Nun gibt es den Thread "AVR-GCC section .text verringern" 
(www.mikrocontroller.net/topic/262532) und ich frage mich, ob ich die 
section auch einfach vergrößern kann.

Also wollte ich das versuchen und das entsprechende Linker Script (wie 
im Beitrag Beitrag "Re: AVR-GCC section .text verringern") 
auslesen.

Für den Atmega328p (avr5) erhalte ich unter Linux Mint allerdings nur 
die Meldung:
1
avr-ld -m avr5
2
avr-ld: cannot open linker script file ldscripts/avr5.xn: No such file or directory

In einem englischen Forum habe ich dazu einen Hinweis gefunden, dass ein 
Symlink erzeugt werden soll, auf das entsprechende ld script. Ich finde 
allerdings die ld scripts überhaupt nicht.
Gibt es ein Vorgehen, mit dem ich sie schnell lokalisieren kann oder 
eventuell andere Möglichkeiten die Textgröße zu verändern?

Das Problem tritt auf, seitdem ich ein recht großes Array im Flash 
erzeugen möchte:
1
const unsigned char name[100] PROGMEM = {};

Die installierte AVR-GCC Version ist 4.8.2

von Watch (Gast)


Lesenswert?

Ich habe den Fehler gefunden. Das Problem saß wie so oft zwischen 
Monitor und Stuhl.
1
avr-gcc -mmcu=atmega328p -Os -o profram.o *.c libraries/*.c apps/*/*.c
2
avr-gcc program.o -o main.elf
Vorher habe ich den output des Compilers zu elf konvertiert und dann in 
ein hex umgewandelt.
Seitdem ich direkt ein elf erzeuge, funktioniert alles:
1
avr-gcc -mmcu=atmega328p -Os -o main.elf *.c libraries/*.c apps/*/*.c

von Konrad S. (maybee)


Lesenswert?

Watch schrieb:
> avr-gcc -mmcu=atmega328p -Os -o profram.o *.c libraries/*.c apps/*/*.c
> avr-gcc program.o -o main.elf

Der Fehler ist, dass beim zweiten Aufruf - also beim Linken des 
Programms - das "-mmcu=atmega328p" fehlt. Der Linker nimmt dann einen 
Default (welchen?).

Du hattest Glück, dass überhaupt ein Fehler gemeldet wurde. Ich hab's 
schon mal geschafft, dass alles stillschweigend durchlief. Erst bei der 
Abarbeitung - ähem - "nichttrivialer" Befehle ist der µC immer wieder in 
einen Reset gelaufen. Hat eine ganze Weile gedauert den Fehler zu 
finden. Das war insofern ein echt interessanter Fehler.

von Rolf M. (rmagnus)


Lesenswert?

Watch schrieb:
> Seitdem ich direkt ein elf erzeuge,

Das da erzeugt schon "direkt ein elf":

> avr-gcc -mmcu=atmega328p -Os -o profram.o *.c libraries/*.c apps/*/*.c

Daß du die Datei "profram.o" nennst, ändert nichts daran, daß es bereits 
das fertige Programm ist.

Konrad S. schrieb:
> Watch schrieb:
>> avr-gcc -mmcu=atmega328p -Os -o profram.o *.c libraries/*.c apps/*/*.c
>> avr-gcc program.o -o main.elf
>
> Der Fehler ist, dass beim zweiten Aufruf - also beim Linken des
> Programms - das "-mmcu=atmega328p" fehlt.

Eigentlich ist der zweite Aufruf auch völlig unnötig. Ich weiß gar 
nicht, was der Compiler da macht, wenn er zum zweiten mal versucht, die 
Standardbibliothek und den Startup-Code dazuzulinken.

> Der Linker nimmt dann einen Default (welchen?).

avr2.

von Konrad S. (maybee)


Lesenswert?

Rolf M. schrieb:
> Eigentlich ist der zweite Aufruf auch völlig unnötig. Ich weiß gar
> nicht, was der Compiler da macht, wenn er zum zweiten mal versucht, die
> Standardbibliothek und den Startup-Code dazuzulinken.

Upps, das hab ich übersehen!

>> Der Linker nimmt dann einen Default (welchen?).
>
> avr2.

Danke.

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.