Forum: Compiler & IDEs lpc2148_demo newlib probleme


von Thomas (Gast)


Lesenswert?

Ich versuche gerade mit der arm-elf-gcc toolchain von hier: 
http://embdev.net/articles/ARM_GCC_toolchain_for_Linux_and_Mac_OS_X (OS 
X Intel)

folgendes Projekt zu bauen:
http://jcwren.com/arm/

Nun erst einmal hat er ein bischen proble mit ein paar assember befehlen
(push {r0} und pop {r0})
Das kommt aber nur im keyboard und lcd sachen vor, also hab ich die 
einfach rausgenommen, da ich die sowieso nicht brauche.
Dann compiliert alles.

Nur das linken geht jetzt noch schief. Es scheint irgendwie was mit der 
Newlib schief zu gehen. So wie ich das verstehe wurde in der arm-elf-gcc 
toolchain Newlib ja ohne Syscalls compiliert. Da die ja ohne os nicht 
wirklich vorhanden sind.
Jetzt gibt es im lpc2148_demo Projekt ein Datei newlib/syscalls.c welche 
ja die nötigen syscalls bereitstellt. Nur der linker findet das 
irgendwie nicht. Ich erhalte folgenden Fehler:

mediaplayer:lpc2148_demo tpost$  make
/Users/tpost/Downloads/lpc2148_demo/common/common.a(ff.o): In function 
`f_sync':
/Users/tpost/Downloads/lpc2148_demo/fatfs/ff.c:1140: undefined reference 
to `get_fattime'
/Users/tpost/Downloads/lpc2148_demo/common/common.a(ff.o): In function 
`f_mkdir':
/Users/tpost/Downloads/lpc2148_demo/fatfs/ff.c:1533: undefined reference 
to `get_fattime'
/Users/tpost/Downloads/lpc2148_demo/common/common.a(ff.o): In function 
`f_open':
/Users/tpost/Downloads/lpc2148_demo/fatfs/ff.c:917: undefined reference 
to `get_fattime'
/opt/arm/bin/../lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libg.a(mal 
locr.o):  In function `_malloc_r':
../../../.././newlib/libc/stdlib/mallocr.c:2160: undefined reference to 
`_sbrk_r'
../../../.././newlib/libc/stdlib/mallocr.c:2197: undefined reference to 
`_sbrk_r'
/opt/arm/bin/../lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libg.a(std 
io.o):  In function `__sclose':
../../../.././newlib/libc/stdio/stdio.c:120: undefined reference to 
`_close_r'
/opt/arm/bin/../lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libg.a(std 
io.o):  In function `__sseek':
../../../.././newlib/libc/stdio/stdio.c:103: undefined reference to 
`_lseek_r'
/opt/arm/bin/../lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libg.a(std 
io.o):  In function `__swrite':
../../../.././newlib/libc/stdio/stdio.c:76: undefined reference to 
`_lseek_r'
../../../.././newlib/libc/stdio/stdio.c:84: undefined reference to 
`_write_r'
/opt/arm/bin/../lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libg.a(std 
io.o):  In function `__sread':
../../../.././newlib/libc/stdio/stdio.c:47: undefined reference to 
`_read_r'
/opt/arm/bin/../lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libg.a(sys 
times.o):  In function `times':
../../../.././newlib/libc/syscalls/systimes.c:11: undefined reference to 
`_times_r'
/opt/arm/bin/../lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libg.a(tim 
e.o):  In function `time':
../../../.././newlib/libc/time/time.c:50: undefined reference to 
`_gettimeofday_r'
/opt/arm/bin/../lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libg.a(fre 
er.o):  In function `_malloc_trim_r':
../../../.././newlib/libc/stdlib/mallocr.c:3326: undefined reference to 
`_sbrk_r'
../../../.././newlib/libc/stdlib/mallocr.c:3335: undefined reference to 
`_sbrk_r'
../../../.././newlib/libc/stdlib/mallocr.c:3340: undefined reference to 
`_sbrk_r'
/opt/arm/bin/../lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libg.a(mak 
ebuf.o):  In function `__smakebuf':
../../../.././newlib/libc/stdio/makebuf.c:52: undefined reference to 
`_fstat_r'
collect2: ld returned 1 exit status
make: *** [lpc2148.elf] Error 1
mediaplayer:lpc2148_demo tpost$

Kann mir da irgendjemand weiterhelfen?

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Thomas schrieb:
>...
> Nun erst einmal hat er ein bischen proble mit ein paar assember befehlen
> (push {r0} und pop {r0})

Das dürfte nicht sein. Evtl. syntax unified in den Assemblercode 
schreiben, falls inline assembler: wird im thumb mode compiliert?

> mediaplayer:lpc2148_demo tpost$  make

Zumindest die Aufrufe inkl. aller Parameter sollte man zeigen, sonst 
fehlt zu viel Kontext.

> /Users/tpost/Downloads/lpc2148_demo/common/common.a(ff.o): In function
> `f_sync':
> /Users/tpost/Downloads/lpc2148_demo/fatfs/ff.c:1140: undefined reference
> to `get_fattime'

Das sieht nicht so aus, wie die üblichen syscalls Geschichten. Die 
Quellcodedatei in der get_fattime implementiert ist sicher ebenfalls 
kompiliert und Objektdatei mitgelinkt?

> /opt/arm/bin/../lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libg.a(mal 
locr.o):
> In function `_malloc_r':
> ../../../.././newlib/libc/stdlib/mallocr.c:2160: undefined reference to
> `_sbrk_r'

o.k., das ist einer der Üblichen. Nachsehen ob in "syscalls.c" eine 
Funktion sbrk_r implementiert ist. Sicherstellen, dass syscalls 
compiliert und syscalls.o gelinkt wird. Damit sollten ein paar Meldungen 
weniger auftauchen, den Rest dann nochmal zeigen.

von Thomas (Gast)


Lesenswert?

Erstmal danke für die hilfe!

Martin Thomas schrieb:
>>...
>> Nun erst einmal hat er ein bischen proble mit ein paar assember befehlen
>> (push {r0} und pop {r0})
>
> Das dürfte nicht sein. Evtl. syntax unified in den Assemblercode
> schreiben, falls inline assembler: wird im thumb mode compiliert?
>
Ja es war inline assembler. Hab den jetzt einfach auf arm code geändert.

>> mediaplayer:lpc2148_demo tpost$  make
>
> Zumindest die Aufrufe inkl. aller Parameter sollte man zeigen, sonst
> fehlt zu viel Kontext.
>
>> /Users/tpost/Downloads/lpc2148_demo/common/common.a(ff.o): In function
>> `f_sync':
>> /Users/tpost/Downloads/lpc2148_demo/fatfs/ff.c:1140: undefined reference
>> to `get_fattime'
>
> Das sieht nicht so aus, wie die üblichen syscalls Geschichten. Die
> Quellcodedatei in der get_fattime implementiert ist sicher ebenfalls
> kompiliert und Objektdatei mitgelinkt?
ja da hab ich was vergessen, ist jetzt aber drin
>
>> /opt/arm/bin/../lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libg.a(mal 
locr.o):
>> In function `_malloc_r':
>> ../../../.././newlib/libc/stdlib/mallocr.c:2160: undefined reference to
>> `_sbrk_r'
>
> o.k., das ist einer der Üblichen. Nachsehen ob in "syscalls.c" eine
> Funktion sbrk_r implementiert ist. Sicherstellen, dass syscalls
> compiliert und syscalls.o gelinkt wird. Damit sollten ein paar Meldungen
> weniger auftauchen, den Rest dann nochmal zeigen.

ja die sbrk_r hat da gefehlt. Ich hab sie jetzt einfach mal leer 
implementiert.

void
*_sbrk_r (struct _reent *r, ptrdiff_t nbytes)
{
    return 0;
}

Jetzt scheint er die sbrk_r auch zu finden. (gibt aber natürlich noch 
warning für unused parameter). Nun scheinen da aber alle reentrant 
syscalls zu fehlen. Heist das jetzt ich muss die alle selbst 
implementieren? Oder krieg ich die irgendwo bereits fertig implementiert 
für meinen arm? Müsste ja eigentlich schon mal jemand gemacht haben 
oder?

von Michael (Gast)


Lesenswert?

Hallo Thomas,

bei mir compiliert es (unter Linux) mit dieser Toolchain:

http://blog.nutaksas.com/2009/05/installing-gnuarm-arm-toolchain-on.html

Zu ändern:

NEWLIB=newlib-1.17.0
in
NEWLIB=newlib-1.16.0

dann läuft es.

Grüße
Michael

P.S. Auf einem Windowssystem läuft das auch in einer Virtualbox z.B.

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.