Forum: Compiler & IDEs AVR: undefined reference to `__muluhisi3'


von Willhelm (Gast)


Lesenswert?

Mit

gcc-Version 4.8.1 (Gentoo 4.8.1-r1 p1.2, pie-0.5.7)


Was ist da los?

von Willhelm (Gast)


Lesenswert?

Mit gcc-4.6.3 funktioniert es ohne Probleme.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Willhelm schrieb:
> Mit gcc-4.6.3 funktioniert es ohne Probleme.

__muluhisi3 gibt es auch erst seit 4.7. Da du offensichtlich sowohl 4.6
als auch 4.8 installiert hast, ist wohl bei letzterer die libgcc (oder
ein Teil davon) verschütt gegangen.

Bei mir hier findet der Linker das __muluhisi3 jedenfalls.

: Bearbeitet durch Moderator
von Johann L. (gjlayde) Benutzerseite


Angehängte Dateien:

Lesenswert?

ALso folgendes Testprogramm läßt sich linken:
1
long fun (unsigned a, long b)
2
{
3
    return a * b;
4
}
5
6
int main ()
7
{
8
    return 0;
9
}
1
avr-gcc -Os -mmcu=atmega8 foo.c -Wl,-Map,foo.map -o foo.elf

Wie im Map-File ersichtlich, wird gegen __muluhisi3 gelinkt:
1
.text.libgcc.mul
2
                0x00000048       0x14 .../bin/../lib/gcc/avr/4.8.0/avr4\libgcc.a(_muluhisi3.o)
3
                0x00000048                __muluhisi3

Der Fehler kann auftauchen, wenn Objekte, die mit einem neuen (>= 4.7) 
Compiler erstellt wurden, mit einer alten (< 4.7) Toolchain gelinkt 
werden.  Die widerspricht jedoch den Release Notes 4.7, siehe Caveats:
1
The AVR port's libgcc has been improved and its multilib structure
2
has been enhanced. As a result, all objects contributing to an
3
application must either be compiled with GCC versions up to 4.6.x
4
or with GCC versions 4.7.1 or later. If the compiler is used with
5
AVR Libc, you need a version that supports the new layout,
6
i.e. implements #35407.

http://gcc.gnu.org/gcc-4.7/changes.html

Wobei es anstatt "compiled" eigentlich "compiled and linked" heißen muß.

Evtl. besteht der Fehler auch darim, daß hart gegen eine bestimmte 
libgcc gelinkt wird oder falsche Linkpfade angegeben wurden.

: Bearbeitet durch User
von Willhelm (Gast)


Lesenswert?

Johann L. schrieb:
> Evtl. besteht der Fehler auch darim, daß hart gegen eine bestimmte
> libgcc gelinkt wird oder falsche Linkpfade angegeben wurden.

Ich versuche immer nur eine Version der Tools zu installieren:

cross-avr/gcc-4.8.1-r1
cross-avr/avr-libc-1.8.0
cross-avr/gcc-4.6.3
cross-avr/binutils-2.23

Den gcc-4.8.1 habe ich mit binutils und libc installiert und es lief 
nicht. Danach habe ich nur den gcc-4.6.3 installiert und dann lief es 
mit dem.

Was da nun genau schief läuft bleibt mir ein Rätsel.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Das Prolem ist reine GCC-Sache und hat weder etwas mit Binutils zu tun 
noch mit der Libc.

Ohne weitere Infos kann man da nicht helfen. Evtl. ergeben sich mehr 
Infos aus einem Mapfile oder beim Aufruf der Tools mit -v

Interessant zu wissen wäre, welche Lib-Suchpfade verwendet werden und wo 
jeweils die libgcc installiert wurde.

: Bearbeitet durch User
von Hans-jürgen H. (hjherbert) Benutzerseite


Lesenswert?

Ich hatte das gleiche Problem

--prefix=/home/hjh/avrgcc_4.x.y gibt beim Compilieren an, wo der 
Compiler hininstalliert wird.

1
binutils.2.23.1  gcc-4.7.2  avr-libc-1.8.0
Braucht LIBDIR = /home/hjh/avrgcc_4.7.2/avr/lib
Beim Compilieren -mmcu=atmega32 und beim Linken -mmcu=atmega32

2
binutils.2.25.1  gcc-4.9.1  avr-libc-1.8.1
Braucht LIBDIR = /home/hjh/avrgcc_4.9.1/avr/lib
Beim Compilieren -mmcu=atmega32 und beim Linken -mmcu=atmega32

3
binutils.2.25.1  gcc-5.2.0  avr-libc-1.8.1
Braucht LIBDIR = PREFIX = /home/hjh/avrgcc_5.2.0/lib/gcc/avr
Beim Compilieren -mmcu=atmega32 und beim Linken -mmcu=avr5

Zumindest laufen dann Compiler und Linker.
Ob das Programm auch taugt, teste ich später.

: Bearbeitet durch User
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.