mikrocontroller.net

Forum: Compiler & IDEs ARM GCC Toolchain Fehler beim Compilieren


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
mein Vorhaben:
Hello World Programm in C schreiben und auf dem BeagleBoard ausführen.
Host: ubuntu-10.04-desktop-i386, läuft bei mir als VirtualMachine.
Target: BeagleBoard -> ARMv7.

Nun bin ich nach dieser Anleitung vorgegangen:
http://embdev.net/articles/ARM_GCC_toolchain_for_L...

mein Code:
 
#include <stdio.h>

int main (void) {
  printf("Hello World\n");
}

Der Befehl zum Compilieren:
arm-elf-gcc hello.c -o hello

Fehlermeldung:
/usr/local/arm/lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libc.a(mallocr.o): In function `_malloc_r':
../../../../../../src/newlib-1.14.0/newlib/libc/stdlib/mallocr.c:2160: undefined reference to `_sbrk_r'
../../../../../../src/newlib-1.14.0/newlib/libc/stdlib/mallocr.c:2197: undefined reference to `_sbrk_r'
/usr/local/arm/lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libc.a(stdio.o): In function `__sclose':
../../../../../../src/newlib-1.14.0/newlib/libc/stdio/stdio.c:120: undefined reference to `_close_r'
/usr/local/arm/lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libc.a(stdio.o): In function `__sseek':
../../../../../../src/newlib-1.14.0/newlib/libc/stdio/stdio.c:103: undefined reference to `_lseek_r'
/usr/local/arm/lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libc.a(stdio.o): In function `__swrite':
../../../../../../src/newlib-1.14.0/newlib/libc/stdio/stdio.c:76: undefined reference to `_lseek_r'
../../../../../../src/newlib-1.14.0/newlib/libc/stdio/stdio.c:84: undefined reference to `_write_r'
/usr/local/arm/lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libc.a(stdio.o): In function `__sread':
../../../../../../src/newlib-1.14.0/newlib/libc/stdio/stdio.c:47: undefined reference to `_read_r'
/usr/local/arm/lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libc.a(freer.o): In function `_malloc_trim_r':
../../../../../../src/newlib-1.14.0/newlib/libc/stdlib/mallocr.c:3326: undefined reference to `_sbrk_r'
../../../../../../src/newlib-1.14.0/newlib/libc/stdlib/mallocr.c:3335: undefined reference to `_sbrk_r'
../../../../../../src/newlib-1.14.0/newlib/libc/stdlib/mallocr.c:3340: undefined reference to `_sbrk_r'
/usr/local/arm/lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libc.a(makebuf.o): In function `__smakebuf':
../../../../../../src/newlib-1.14.0/newlib/libc/stdio/makebuf.c:52: undefined reference to `_fstat_r'
collect2: ld gab 1 als Ende-Status zurück

Müsste aber doch eigenlich alles stimmen? Oder habe ich etwas übersehen?
Wo liegt der Fehler? :)

Gruß
Michael

Autor: Marius Wensing (mw1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der ARM-GCC nutzt die newlib. Die Funktionen die dort aufgelistet sind, 
musst du bereitstellen, damit du printf nutzen kannst. Das liegt daran, 
dass es ja viele verschiedene ARM-Modelle gibt. Die Newlib teilt sich 
daher in den hardwareunabhängigen Teil und den Teil für die Hardware. 
Und genau den Teil musst du selbst programmieren.

MfG
Marius

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
merci,
und wie programmiere ich den hardwareabhängigen Teil?

Autor: Marius Wensing (mw1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal ein Auszug aus der Newlib-Dokumentation:
http://www.sourceware.org/newlib/libc.html#Syscalls

Mehr kann ich dir leider nicht dazu sagen, da ich mich damit noch nicht 
so sehr intensiv beschäftigt habe.

Da du allerdings das Beagle-Board nutzt gehe ich davon aus, dass du dort 
Linux drauf laufen hast. Wenn dem so ist, brauchst du einen anderen 
Compiler. Der heißt meist arm-linux-gcc oder ähnlich und beinhaltet dann 
entsprechende Linux-Syscalls. Erstellen kannst du dir einen solchen 
Compiler dann zum Beispiel mit dem Buildroot-Paket.

MfG
Marius

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Link,

und ja auf dem BeagleBoard läuft Linux (Angström).
Ich dachte, dass dieser Compiler funktioniert, da er ja das elf "Format" 
unterstützt/benutzt welches ja auf Unix/Linux Systemen Verwendung 
findet.

Das heißt also, ich komme mit
http://embdev.net/articles/ARM_GCC_toolchain_for_L...
nicht zum Ziel...?

Ich hätte noch zwei Seiten/Möglichkeiten:
Sourcery G++
http://www.codesourcery.com/sgpp/lite/arm/portal/s...

und
Crosstool-NG
http://ymorin.is-a-geek.org/projects/crosstool

Welches davon kann man einem Anfänger empfehlen?
Gibt es eine andere/bessere Möglichkeit für Anfänger?


Grüße
Michael

Autor: Marius Wensing (mw1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich arbeite derzeit mit einem ARM9-Board (Micro2440) und nutze die 
Buildroot-Umgebung um mir meine Toolchain zu erstellen. Das klappt alles 
wunderbar. Ich würde es durchaus weiterempfehlen, jedoch weiß ich nicht, 
wie der Beagle-Board-Support dort ist.

Prinzipiell sollte es aber auch eine fertige Toolchain von CodeSourcery 
tun. Installier das hier mal:  Sourcery G++ Lite for ARM GNU/Linux

Damit sollte es funktionieren.

MfG
Marius

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal vielen Dank Marius!!!

Konnte Sourcery_G++_Lite erfolgreich installieren.
Das erste Programm läuft auch schon.

Aber natürlich gibts jetzt schon das nächste "Problem":
Das übergeben des Library-Pfades des Targets direkt beim 
Compilieren/Linken auf dem Host funktioniert nicht.

Beitrag "CodeSourcery: Problem beim Compilieren/Linken"


Gruß
Michael

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.