ARM GCC Toolchain Fehler beim Compilieren

Gast #1825963
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_Linux_and_Mac_OS_X

mein Code:
1
 
2
#include <stdio.h>
3

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

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

Fehlermeldung:
1
/usr/local/arm/lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libc.a(mallocr.o): In function `_malloc_r':
2
../../../../../../src/newlib-1.14.0/newlib/libc/stdlib/mallocr.c:2160: undefined reference to `_sbrk_r'
3
../../../../../../src/newlib-1.14.0/newlib/libc/stdlib/mallocr.c:2197: undefined reference to `_sbrk_r'
4
/usr/local/arm/lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libc.a(stdio.o): In function `__sclose':
5
../../../../../../src/newlib-1.14.0/newlib/libc/stdio/stdio.c:120: undefined reference to `_close_r'
6
/usr/local/arm/lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libc.a(stdio.o): In function `__sseek':
7
../../../../../../src/newlib-1.14.0/newlib/libc/stdio/stdio.c:103: undefined reference to `_lseek_r'
8
/usr/local/arm/lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libc.a(stdio.o): In function `__swrite':
9
../../../../../../src/newlib-1.14.0/newlib/libc/stdio/stdio.c:76: undefined reference to `_lseek_r'
10
../../../../../../src/newlib-1.14.0/newlib/libc/stdio/stdio.c:84: undefined reference to `_write_r'
11
/usr/local/arm/lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libc.a(stdio.o): In function `__sread':
12
../../../../../../src/newlib-1.14.0/newlib/libc/stdio/stdio.c:47: undefined reference to `_read_r'
13
/usr/local/arm/lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libc.a(freer.o): In function `_malloc_trim_r':
14
../../../../../../src/newlib-1.14.0/newlib/libc/stdlib/mallocr.c:3326: undefined reference to `_sbrk_r'
15
../../../../../../src/newlib-1.14.0/newlib/libc/stdlib/mallocr.c:3335: undefined reference to `_sbrk_r'
16
../../../../../../src/newlib-1.14.0/newlib/libc/stdlib/mallocr.c:3340: undefined reference to `_sbrk_r'
17
/usr/local/arm/lib/gcc/arm-elf/4.1.0/../../../../arm-elf/lib/libc.a(makebuf.o): In function `__smakebuf':
18
../../../../../../src/newlib-1.14.0/newlib/libc/stdio/makebuf.c:52: undefined reference to `_fstat_r'
19
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
#1826015
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
#1826051
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
Gast #1826065
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_Linux_and_Mac_OS_X
nicht zum Ziel...?

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

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
#1826081
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren