Linux auf ARM - cross Kompilierung

OP (Firma: keine) #2460217
Lesenswert?

Ich habe auf meinem AT91 ein Linux zum laufen bekommen 
(http://www.at91.com/linux4sam/bin/view/Linux4SAM/GettingStarted#Demo9263). 
Via UART kann ich die shell remote bedienen. Jetzt wollte ich ein 
einfaches "hello world" auf die Konsole zaubern. Dazu habe ich die GCC 
toolchain für ARM auf meinem Ubuntu eingerichtet und ein einfaches hello 
word geschrieben. Kompiliert hat er ohne Probleme. Jedoch hat das binary 
auf meinem embedded Linux ein segmentation fault hervorgerufen. Jetzt 
versuche ich natürlich herauszufinden woran es liegen könnten: Am 
kompiliervorgang? Am Linux selbst?
Ich fange mal mit dem code und dem GCC aufruf an:
1
#include <stdio.h>
2
int main(int argc, char *argv[])
3
{
4
printf("hallo");
5
return 0;
6
}
1
 arm-elf-gcc -Wall -mcpu=arm9 test.c -o test

ich bin für jeden tip dankbar
OP (Firma: keine) #2460241
Lesenswert?

@Tobi: sprich gcc für ARM besorgen (bauen) und nativ kompilieren? Mh ist 
das nicht recht ressourcen hungrig? Hast du vll ein howto, damit ich mir 
das mal anschauen kann? Wobei ich cross kompilieren eingentlich 
bevorzuge... Müsste man mal testen.

@ozo: Also die toolchain habe ich mir komplett selbst gebaut, sprich die 
Quellen (gabs hier http://www.gnuarm.com/) genommen und für die ARM 
Architektur gebaut. Mitgeliefert gabs keine (http://www.at91.com).
Gast #2460260
Lesenswert?

Ok, verstanden. Und dein "hello world" wird mit der toolchain, welche 
auch das System übersetzt hat, gebaut?
Ich frag so blöd, weil ich gerne in so Fallen reintappe.
Laut der Seite aus deinem Link gibts aber Buildroot für die Platform, 
oder?
OP (Firma: keine) #2460340
Lesenswert?

Werner B. schrieb:
> Das ist vergleichbar mit amerikanischen Mars-Sonden ;-)
>
> Der Sensor liefert Messwerte in Feet.
> Gerechnet wird mit Meter.
> (oder wars andersherum 8-D)
>
> Das macht Löcher in die Oberfläche des Ziels.

ein wenig genauer und ich könnte anfangen zu suchen! der Compiler ist 
der falsche?!

@Rolf Magnus: habe ich auch schon überlegt, benutze diesen in meiner 
cygwin umgebung, wobei ich dort ohne linux auskomme. könntest du mir 
sagen wieso ich lieber diesen probieren soll?
Gast #2460450
Lesenswert?

Tobi schrieb:
> ich kompiliere inzwischen direkt auf meinem Pandaboard. Das ist deutlich
> stressfreier als die Verwendung eines Cross Compilers. Das sollte mit
> deinem Board auch gehen.

distcc wäre ein Ansatz um sich den Crosscompile Nerv zu sparen und 
trotzdem nicht ewig zu warten.
Gast #2461085
Lesenswert?

@wanderameise,

>@Tobi: sprich gcc für ARM besorgen (bauen) und nativ kompilieren? Mh ist
>das nicht recht ressourcen hungrig? Hast du vll ein howto, damit ich mir
>das mal anschauen kann? Wobei ich cross kompilieren eingentlich
>bevorzuge... Müsste man mal testen.

Ich habe hier eine aktuelle Ubuntu Version auf dem Desktop Rechner 
laufen. Damit kannst du für ARM ein Image mit dem Befehl rootstock 
erzeugen. Das Image enthält ein komplettes Ubuntu System für ARM. Wenn 
das Board Internet Zugang hat, kannst du mittels "sudo apt-get install 
build-essential" den GCC installieren.

Gruss,
Tobi
OP (Firma: keine) #2461220
Lesenswert?

Rolf Magnus schrieb:
> Peterle Anonym schrieb:
>> @Rolf Magnus: habe ich auch schon überlegt, benutze diesen in meiner
>> cygwin umgebung, wobei ich dort ohne linux auskomme. könntest du mir
>> sagen wieso ich lieber diesen probieren soll?
>
> Ich denke, daß der, den du probiert hast, dafür gedacht ist, Programme
> zu generieren, die ohne Betriebssystem direkt auf dem Prozessor laufen.

Das war die erste frage die ich mir gestellt habe - kann ich code den 
ich für meine MCU ohne OS geschrieben habe, genauso mit OS ausführen? 
Also, die Zielarchitektur ist schonmal die selbe. jedoch habe ich ein 
linker file, das mir sagt wohin der code kommt. das fällt doch bei einem 
OS weg, da ja dieses die Speicherverwaltung organisiert. Kann es also 
sein, dass mein binary auf eine Adresse schreiben will, die dem Linux 
gar nicht mehr zur verfügung steht, da da zB Uboot liegt?! Oder erkennt 
das das OS und fügt einen offset ein, damit mein code im user space 
landet?
Das würde bedeuten, das man einen kompiler benutzen muss, der weiss, 
dass der code für Linux geschrieben wird. Das könnte auch zu Werner B.'s 
anspielung passen...
#2461421
Lesenswert?

Peterle Anonym schrieb:
> Das war die erste frage die ich mir gestellt habe - kann ich code den
> ich für meine MCU ohne OS geschrieben habe, genauso mit OS ausführen?

Nein. Unter Linux greift dein Programm auf sämtliche Ressourcen über 
Linux-Systemcalls zu. Ohne OS muß es das alles direkt tun.

> Also, die Zielarchitektur ist schonmal die selbe. jedoch habe ich ein
> linker file, das mir sagt wohin der code kommt. das fällt doch bei einem
> OS weg, da ja dieses die Speicherverwaltung organisiert.

Da kann aber der Linker trotzdem sagen, wo das OS den Code in den 
Adressraum mappen soll.

> Kann es also sein, dass mein binary auf eine Adresse schreiben will, die
> dem Linux gar nicht mehr zur verfügung steht, da da zB Uboot liegt?!

Unter Linux hast du Speicher-Virtualisierung. Das heißt, dein Programm 
greift nie direkt auf realen Speicher zu. Es greift auf Segmente zu, die 
der Kernel dann irgendwie auf den echten Speicher (oder auf irgendwas 
anderes) mappt.
OP (Firma: keine) #2461440
Lesenswert?

Rolf Magnus schrieb:
> Peterle Anonym schrieb:
>> Das war die erste frage die ich mir gestellt habe - kann ich code den
>> ich für meine MCU ohne OS geschrieben habe, genauso mit OS ausführen?
>
> Nein. Unter Linux greift dein Programm auf sämtliche Ressourcen über
> Linux-Systemcalls zu. Ohne OS muß es das alles direkt tun.
>

ja ich weiss, ich meinte damit, ob ich ein binary für ARm linux mit 
derselben toolchain bauen kann wie ohne Linux.

>> Also, die Zielarchitektur ist schonmal die selbe. jedoch habe ich ein
>> linker file, das mir sagt wohin der code kommt. das fällt doch bei einem
>> OS weg, da ja dieses die Speicherverwaltung organisiert.
>
> Da kann aber der Linker trotzdem sagen, wo das OS den Code in den
> Adressraum mappen soll.
>

ok aber mein output sagt ja erstmal, starte ab adresse 0x0 im NAND, das 
ist ja unfug, da dort ja zB Uboot liegt und nicht der user space. oder 
juckt es das OS nicht und es schiebt den code einfach in den richtigen 
Addressbereich?!

>> Kann es also sein, dass mein binary auf eine Adresse schreiben will, die
>> dem Linux gar nicht mehr zur verfügung steht, da da zB Uboot liegt?!
>
> Unter Linux hast du Speicher-Virtualisierung. Das heißt, dein Programm
> greift nie direkt auf realen Speicher zu. Es greift auf Segmente zu, die
> der Kernel dann irgendwie auf den echten Speicher (oder auf irgendwas
> anderes) mappt.

ich weiss, es geht nicht um Adresszugriffe, sondern um die Adressen, die 
im executable stehen, also da wo der code hin soll, und die liegen was 
weiss ich wo.
#2461455
Lesenswert?

Peterle Anonym schrieb:

>> Unter Linux hast du Speicher-Virtualisierung. Das heißt, dein Programm
>> greift nie direkt auf realen Speicher zu. Es greift auf Segmente zu, die
>> der Kernel dann irgendwie auf den echten Speicher (oder auf irgendwas
>> anderes) mappt.
>
> ich weiss, es geht nicht um Adresszugriffe, sondern um die Adressen, die
> im executable stehen, also da wo der code hin soll, und die liegen was
> weiss ich wo.

Das Executable bestimmt nicht, wo es hingeladen wird, sondern der 
Kernel. Der gibt deinem Prozess einen virtuellen Adressraum, und dessen 
Adresse 0 hat nichts mit der Adresse 0 des realen Speichers zu tun. Und 
das gilt auch schon beim Laden des Programms.
OP (Firma: keine) #2461540
Lesenswert?

Rolf Magnus schrieb:
> Peterle Anonym schrieb:
>
>>> Unter Linux hast du Speicher-Virtualisierung. Das heißt, dein Programm
>>> greift nie direkt auf realen Speicher zu. Es greift auf Segmente zu, die
>>> der Kernel dann irgendwie auf den echten Speicher (oder auf irgendwas
>>> anderes) mappt.
>>
>> ich weiss, es geht nicht um Adresszugriffe, sondern um die Adressen, die
>> im executable stehen, also da wo der code hin soll, und die liegen was
>> weiss ich wo.
>
> Das Executable bestimmt nicht, wo es hingeladen wird, sondern der
> Kernel. Der gibt deinem Prozess einen virtuellen Adressraum, und dessen
> Adresse 0 hat nichts mit der Adresse 0 des realen Speichers zu tun. Und
> das gilt auch schon beim Laden des Programms.

ok danke!

@asd: also gcc explizit für ARM linux bauen?!

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