Forum: Mikrocontroller und Digitale Elektronik STM32F4 GCC Toolchain: syscalls.c printf und malloc Errors


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Christian J. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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

von Christian J. (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.

von Frank M. (ukw) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
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:
caddr_t _sbrk(int increment)
{
    extern char end asm("end");
    register char * pStack asm("sp");
    static char *   s_pHeapEnd;

    if (!s_pHeapEnd)
    {
        s_pHeapEnd = &end;
    }

    if (s_pHeapEnd + increment > pStack)
    {
        return (caddr_t) -1;
    }

    char * pOldHeapEnd = s_pHeapEnd;
    s_pHeapEnd += increment;
    return (caddr_t) pOldHeapEnd;
}

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.

von Christian J. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Gerhard W. (dd4da) Flattr this


Bewertung
1 lesenswert
nicht lesenswert
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.

von Christian J. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.