Forum: Compiler & IDEs R_AVR_13_PCREL against symbol


von Werner (Gast)


Lesenswert?

Hallo,

ich habe wie im Betreff geschrieben ein Problem beim Linken. Die 
Bibliothek libm.a wird im Linker am Ende mitgelinkt. Nichtsdestrotz 
bekomme ich immer den Fehler. Verschiedene Einstellungen am Compiler 
haben mich nicht weitegebracht.

Unten habe ich die gesamte Ausgabe eingefügt. Ich weiss nicht woran der 
Fehler liegen könnte.

Wäre dankbar wenn mir jemand einen Tipp geben könnte.

Grüße
Werner
1
avr-gcc -Wall -Os -lm -mmcu=atmega162 -DF_CPU=11059200UL -MMD -MP -MF"ucossource/os_core.d" -MT"ucossource/os_core.d" -c -o "ucossource/os_core.o" "../ucossource/os_core.c"
2
3
avr-gcc -Wall -Os -lm -mmcu=atmega162 -DF_CPU=11059200UL -MMD -MP -MF"ucossource/os_flag.d" -MT"ucossource/os_flag.d" -c -o "ucossource/os_flag.o" "../ucossource/os_flag.c"
4
5
avr-gcc -Wall -Os -lm -mmcu=atmega162 -DF_CPU=11059200UL -MMD -MP -MF"ucossource/os_mbox.d" -MT"ucossource/os_mbox.d" -c -o "ucossource/os_mbox.o" "../ucossource/os_mbox.c"
6
7
avr-gcc -Wall -Os -lm -mmcu=atmega162 -DF_CPU=11059200UL -MMD -MP -MF"ucossource/os_mem.d" -MT"ucossource/os_mem.d" -c -o "ucossource/os_mem.o" "../ucossource/os_mem.c"
8
9
avr-gcc -Wall -Os -lm -mmcu=atmega162 -DF_CPU=11059200UL -MMD -MP -MF"ucossource/os_mutex.d" -MT"ucossource/os_mutex.d" -c -o "ucossource/os_mutex.o" "../ucossource/os_mutex.c"
10
11
avr-gcc -Wall -Os -lm -mmcu=atmega162 -DF_CPU=11059200UL -MMD -MP -MF"ucossource/os_q.d" -MT"ucossource/os_q.d" -c -o "ucossource/os_q.o" "../ucossource/os_q.c"
12
13
avr-gcc -Wall -Os -lm -mmcu=atmega162 -DF_CPU=11059200UL -MMD -MP -MF"ucossource/os_sem.d" -MT"ucossource/os_sem.d" -c -o "ucossource/os_sem.o" "../ucossource/os_sem.c"
14
15
avr-gcc -Wall -Os -lm -mmcu=atmega162 -DF_CPU=11059200UL -MMD -MP -MF"ucossource/os_task.d" -MT"ucossource/os_task.d" -c -o "ucossource/os_task.o" "../ucossource/os_task.c"
16
17
avr-gcc -Wall -Os -lm -mmcu=atmega162 -DF_CPU=11059200UL -MMD -MP -MF"ucossource/os_time.d" -MT"ucossource/os_time.d" -c -o "ucossource/os_time.o" "../ucossource/os_time.c"
18
 
19
avr-gcc -Wall -Os -lm -mmcu=atmega162 -DF_CPU=11059200UL -MMD -MP -MF"MTuart.d" -MT"MTuart.d" -c -o "MTuart.o" "../MTuart.c"
20
21
avr-gcc -Wall -Os -lm -mmcu=atmega162 -DF_CPU=11059200UL -MMD -MP -MF"Main.d" -MT"Main.d" -c -o "Main.o" "../Main.c"
22
../Main.c:264: warning: 'AppTask3' defined but not used
23
../Main.c:280: warning: 'AppTask4' defined but not used
24
 
25
26
avr-gcc -x assembler-with-cpp -mmcu=atmega162 -MMD -MP -MF"os_cpu_a.d" -MT"os_cpu_a.d" -c -o "os_cpu_a.o" "../os_cpu_a.S"
27
 
28
avr-gcc -Wall -Os -lm -mmcu=atmega162 -DF_CPU=11059200UL -MMD -MP -MF"os_cpu_c.d" -MT"os_cpu_c.d" -c -o "os_cpu_c.o" "../os_cpu_c.c"
29
30
avr-gcc -Wl,-Map,AVRCompilerTest.map -lm -mmcu=atmega162 -o "AVRCompilerTest.elf"  ./ucossource/os_core.o ./ucossource/os_flag.o ./ucossource/os_mbox.o ./ucossource/os_mem.o ./ucossource/os_mutex.o ./ucossource/os_q.o ./ucossource/os_sem.o ./ucossource/os_task.o ./ucossource/os_time.o  ./MTuart.o ./Main.o ./os_cpu_a.o ./os_cpu_c.o   -lm
31
./os_cpu_a.o: In function `_not_first_int':
32
(.text+0x1ea): relocation truncated to fit: R_AVR_13_PCREL against symbol `OSTimeTick' defined in .text section in ./ucossource/os_core.o
33
./os_cpu_a.o: In function `_not_first_int':
34
(.text+0x1ee): relocation truncated to fit: R_AVR_13_PCREL against symbol `OSIntExit' defined in .text section in ./ucossource/os_core.o

von Yalu X. (yalu) (Moderator)


Lesenswert?

Offensichtlich werden irgendwo OSTimeTick und OSIntExit PC-relativ über
eine zu große Distanz angesprungen. Schau mal nach, ob du in os_cpu_a.S
folgende Zeilen findest:
1
  rcall OSTimeTick

und
1
  rcall OSIntExit

Wenn ja, ersetze rcall jeweils durch call.

Alternativ kannst du im Linker-Befehl die Argumente anders anordnen, so
dass ./os_cpu_a.o näher bei ./ucossource/os_core.o steht.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Mach das -lm ans Ende der Optionen des (Linker-)Aufrufs.

Wenn das nicht hilft ist's wahrscheinlich
- Falsches (Inline) Assembler, s.o
- http://savannah.nongnu.org/bugs/?33698
- http://sourceware.org/PR13410

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


Lesenswert?

Johann L. schrieb:
> Mach das -lm ans Ende der Optionen des (Linker-)Aufrufs.

Hat er schon.  Die Beschwerde richtet sich ja auch überhaupt nicht
gegen irgendwas aus libm.a oder libgcc.a.

Ich vermute, dass Yalu Recht hat und os_cpu_a.S Mist macht.

von Werner (Gast)


Lesenswert?

Danke Euch allen Dreien.

Yalu X. schrieb:
> rcall OSTimeTick
>
> und
>   rcall OSIntExit
>
> Wenn ja, ersetze rcall jeweils durch call.


Exakt das war es. Wäre ich nie selber drauf gekommen. Mir ist zwar schon 
aufgefallen, dass sich die Fehlermeldungen auf die Assembler-Datei 
bezogen aber auf den rcall bin ich nicht gekommen. Ich habe da schon 
seit Tagen gesucht und Google hat mir auch nicht weitergeholfen.

Nochmals vielen Dank

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Werner schrieb:
> Danke Euch allen Dreien.
>
> Yalu X. schrieb:
>>   rcall OSTimeTick
>> und
>>   rcall OSIntExit
>>
>> Wenn ja, ersetze rcall jeweils durch call.
>
> Exakt das war es. Wäre ich nie selber drauf gekommen.

Wenn die Quelle für unterschiedliche Devices zum Einsatz kommt kann man 
auch parametrisieren, zB per
1
#if defined (__AVR_HAVE_JMP_CALL__)
2
#define XCALL call
3
#define XJMP  jmp
4
#else
5
#define XCALL rcall
6
#define XJMP  rjmp
7
#endif

und XCALL bzw. XJMP verwenden.  Um die kurze Variante zu erzeugen falls 
verfügbar, gibt man -mrelax oder -Wl,--relax an.

Jörg Wunsch schrieb:
> Johann L. schrieb:
>> Mach das -lm ans Ende der Optionen des (Linker-)Aufrufs.
>
> Hat er schon.

Ah ja, jetzt seh ich's.

> Die Beschwerde richtet sich ja auch überhaupt nicht
> gegen irgendwas aus libm.a oder libgcc.a.

A propos, wird #33698 irdendwann mal gefixt?

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


Lesenswert?

Johann L. schrieb:
> A propos, wird #33698 irdendwann mal gefixt?

Ja, wie ich schon mal schrieb, typischerweise setze ich mich ein
paar Abende lang hin und arbeite Bugfixes ein während der Vorbereitung
für ein neues Release.  Ich gehe mal davon aus, dass das noch vor
den Sommerferien sein wird, aber vorher möchte ich erstmal AVRDUDE
6.0 freigeben.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Jörg Wunsch schrieb:

> typischerweise setze ich mich ein paar Abende lang hin und arbeite
> Bugfixes ein während der Vorbereitung für ein neues Release.

hmm, ok

Insbesondere #35407 ist womöglich doch etwas mehr Aufwand, insbesondere 
die erforderlichen Erweiterungen im Buildsystem gegen verschiedene 
gcc-Versionen zu testen. Wenn ich recht sehe wird momentan noch 
-mtiny-stack als multilib-Option verwendet; korrekt wäre aber -msp8.

Wenn die multilib-Layouts von Lib und gcc nicht zusammenpassen, dann 
kann man mit einer Release nicht viel anfangen -- egal wieviel andere 
Bugs diese behebt :-/

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


Lesenswert?

Johann L. schrieb:
> Wenn die multilib-Layouts von Lib und gcc nicht zusammenpassen, dann
> kann man mit einer Release nicht viel anfangen -- egal wieviel andere
> Bugs diese behebt :-/

Ja, danke für die Vorwarnung, ich werde mir dafür entsprechend mehr
Zeit gedanklich einplanen.  Einen SVN-trunk-GCC habe ich ja typisch
ohnehin daliegen, gegen den ich das testen kann.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Jörg Wunsch schrieb:
> Johann L. schrieb:
>> Wenn die multilib-Layouts von Lib und gcc nicht zusammenpassen, dann
>> kann man mit einer Release nicht viel anfangen -- egal wieviel andere
>> Bugs diese behebt :-/
>
> Ja, danke für die Vorwarnung, ich werde mir dafür entsprechend mehr
> Zeit gedanklich einplanen.

und damit's nicht allzu langweilig wird: -msp8 ist erst ab 4.7.1 
bekannt.
In 4.7.0 — und nur dort — fungiert -mtiny-stack als multilib-Option, 
siehe PR51345 und PR52741.

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.