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?
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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.