Hallo, bei der Verwendung von stdlib Funktionen wird wieder der ominöse Fehler c:/program files (x86)/emblocks/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.7.3/../../ ../../arm-none-eabi/lib/armv7e-m/fpu\librdimon.a(rdimon-syscalls.o): In function `_sbrk': syscalls.c:(.text._sbrk+0x30): undefined reference to `end' collect2.exe: error: ld returned 1 exit status Process terminated with status 1 (0 minutes, 1 seconds) 1 errors, 0 warnings (0 minutes, 1 seconds) erzeugt. Egal welche Funktion, es kann auch srand oder rand sein. Googlen brachte wenig Hinweise aber es hat auf jeden Fall mit der GCC Toolchain zu tun, dass da Libraries nicht gefunden werden. Aber auch im Linkerfile kann was strubbelig sein, kann.... Nun ist EmBlocks "ab Werk" eingestellt.... Eine gewisse "syscalls.c" finde ich zb auch noch in den Projekten von Uwe Becker, seine Projekte haben dieses Problem TEILWEISEauch wenn ich sie im Emblocks importiere. printf, malloc, srand ... alle lösen es aus. Nur bei der "Demo der ADC-DMA-Library" ist es anders, da kommt keine Fehlermeldung. Compiling: main.c Linking executable: .\stm32f429.elf Creating Hex-file. c:/program files (x86)/emblocks/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.7.3/../../ ../../arm-none-eabi/lib/armv7e-m/fpu\libnosys.a(sbrk.o): In function `_sbrk': sbrk.c:(.text._sbrk+0x30): undefined reference to `end' collect2.exe: error: ld returned 1 exit status Process terminated with status 1 (0 minutes, 2 seconds) 1 errors, 0 warnings (0 minutes, 2 seconds) Wo soll man da suchen? Gruss, Christian
So, ab ins Bett. Die Sache ist mir ne Nummer zu gross, zu tief im Eingemachten von GCC, Linker Skripts usw. Könnte das mal einer der Cracks hier "reparieren"? Anbei meine "wichtigen" Files für das STM32F429 Disko Board. main.c ist für sich selbst sinnlos, soll nur die Fehler erzeugen durch malloc und srand.
Christian J. schrieb: > bei der Verwendung von stdlib Funktionen wird wieder der ominöse Fehler > > c:/program files > (x86)/emblocks/share/em_armgcc/bin/../lib/gcc/arm-none-eabi/4.7.3/../../ ../../arm-none-eabi/lib/armv7e-m/fpu\librdimon.a(rdimon-syscalls.o): > In function `_sbrk': > syscalls.c:(.text._sbrk+0x30): undefined reference to `end' > collect2.exe: error: ld returned 1 exit status > Process terminated with status 1 (0 minutes, 1 seconds) > 1 errors, 0 warnings (0 minutes, 1 seconds) > > erzeugt. Egal welche Funktion, es kann auch srand oder rand sein. Normalerweise ist es so, dass printf() und deren Verwandte eine Funktion _sbrk() benötigt, um Speicher zu allokieren. Diese muss man normalerweise selbst definieren, z.B. so:
1 | caddr_t _sbrk(int increment) |
2 | {
|
3 | extern char end asm("end"); |
4 | register char * pStack asm("sp"); |
5 | static char * s_pHeapEnd; |
6 | |
7 | if (!s_pHeapEnd) |
8 | {
|
9 | s_pHeapEnd = &end; |
10 | }
|
11 | |
12 | if (s_pHeapEnd + increment > pStack) |
13 | {
|
14 | return (caddr_t) -1; |
15 | }
|
16 | |
17 | char * pOldHeapEnd = s_pHeapEnd; |
18 | s_pHeapEnd += increment; |
19 | return (caddr_t) pOldHeapEnd; |
20 | }
|
Dort wird "end" als extern char asm("end") deklariert. Aus irgendeinem Grunde ist bei Dir das "end" nicht existent, was wohl an einem verhunzten Linker-Script liegt. Aber vielleicht sieht Deine _sbrk()-Funktion ja ganz anders aus.
Frank M. schrieb: > Dort wird "end" als extern char asm("end") deklariert. Das ist bei mir auch irgendwo, gestern gesehen. Kann das jetzt auf der Arbeit aber nicht nachschauen. Es ist aber auch ein Drama: Bei dem Original EmBlocks Startup und Linker Script lässt sich kein FlashRelease erstellen, das Proggi startet nicht bei Reset, nur im Debugger Nehme ich die von "Uwe B." aus seinen Projekten (startup und linker script) klappt das Booten aber das oben zitierte eben nicht mehr :-( Außerdem taucht da ein syscalls.c auf, was bei mir vorher nicht da war. Und das hier habe ich grad noch aus einem anderen Beitrag gefischt, was ich nicht drin habe: /* Pointers to end of data for dynamic memory management */ PROVIDE (end = _ebss); PROVIDE (_end = _ebss); /* Remove debugging from standard libraries */ DISCARD : { libc.a (*) libm.a (*) libgcc.a (*) } Nur ne Frage der Zeit, ich versuche auch ganz ruhig zu bleiben..... Kann ich dir nicht mal den ganzen Projektordner schicken, bzw ihn hochladen? Ist für EmBlocks.
Auch wenn der Thread schon älter ist taucht die Frage doch öfter mal auf und ich will meine Lösung posten. Das Linker-Script ist um die zwei Einträge zu ergänzen. /* Remove information from the standard libraries */ DISCARD : { libc.a ( * ) libm.a ( * ) libgcc.a ( * ) libg.a ( * ) <----- libnosys.a ( * ) <----- } Funktioniert gut.
Und was bewirken die? Ich arbeite inzwischen ohnehin mit der nano-lib aber viellleicht mal gut zu wissen. PS: Wie kann man eingentlich die neueste Version der nano libs erzeugen und in den GCC einbinden unter Windows?
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.