Forum: Compiler & IDEs ARM GCC Toolchain Fehler beim Compilieren


von Michael (Gast)


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

von Marius W. (mw1987)


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

von Michael (Gast)


Lesenswert?

merci,
und wie programmiere ich den hardwareabhängigen Teil?

von Marius W. (mw1987)


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

von Michael (Gast)


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

von Marius W. (mw1987)


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

von Michael (Gast)


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

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