Forum: Compiler & IDEs Kann Binary nicht ausführen. arm-linux-gnueabi


von Sigint 112 (sigint)


Lesenswert?

Hallo zusammen,
  ich muss mal wieder nachfragen, da ich ein Problem mit dem 
CrossCompiling habe. Ich hab es bis jetzt nicht geschafft eine 
Cross-Toolchain für mein Arietta G25 zu basteln, wesswegen ich die 
glorreiche Idee hatte eine andere Toolchain zu nehmen. Im Netz hab ich 
eine Toolchain mit dem Namen 
"gcc-linaro-arm-linux-gnueabi-2012.04-20120426_win32" gefunden, die 
meiner Ansicht nach am besten passen sollte. Leider kenn ich mich mit 
GCC nicht so gut aus, und hab bis jetzt noch keine einfache und kurze 
Doku gefunden, die für mich die grobe Struktur von GCC darlegt. Nun hab 
ich versucht mit der Toolchain ein Hello World Programm zu übersetzten. 
Ich bekomme eine Binary, die ich allerdings nicht ausführen kann. Ich 
bekomme nur die Fehlermeldung :"Illegal Instruction". Ich hab keine 
Ahnung, wieso die Datei nicht läuft. Zum testen hab ich noch eine Datei 
auf dem Arietta erstellt und mit der anderen Binärdatei verglichen.

Nativ übersetzt:
1
$ readelf -h nativ.ex
2
ELF Header:
3
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
4
  Class:                             ELF32
5
  Data:                              2's complement, little endian
6
  Version:                           1 (current)
7
  OS/ABI:                            UNIX - System V
8
  ABI Version:                       0
9
  Type:                              EXEC (Executable file)
10
  Machine:                           ARM
11
  Version:                           0x1
12
  Entry point address:               0x831c
13
  Start of program headers:          52 (bytes into file)
14
  Start of section headers:          1840 (bytes into file)
15
  Flags:                             0x5000002, has entry point, Version5 EABI
16
  Size of this header:               52 (bytes)
17
  Size of program headers:           32 (bytes)
18
  Number of program headers:         8
19
  Size of section headers:           40 (bytes)
20
  Number of section headers:         31
21
  Section header string table index: 28
22
23
$ file nativ.ex
24
nativ.ex: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=48c5786788dcb15d1deb1dc748139f8feaf67da6, not stripped

Cross-Compiled
1
$ readelf -h a.out
2
ELF Header:
3
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
4
  Class:                             ELF32
5
  Data:                              2's complement, little endian
6
  Version:                           1 (current)
7
  OS/ABI:                            UNIX - System V
8
  ABI Version:                       0
9
  Type:                              EXEC (Executable file)
10
  Machine:                           ARM
11
  Version:                           0x1
12
  Entry point address:               0x8768
13
  Start of program headers:          52 (bytes into file)
14
  Start of section headers:          359072 (bytes into file)
15
  Flags:                             0x5000002, has entry point, Version5 EABI
16
  Size of this header:               52 (bytes)
17
  Size of program headers:           32 (bytes)
18
  Number of program headers:         6
19
  Size of section headers:           40 (bytes)
20
  Number of section headers:         29
21
  Section header string table index: 26
22
23
$ file a.out
24
a.out: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 2.6.26, BuildID[sha1]=f1ec2054a52be7f57b66b6b4d49fad06407c6613, not stripped

Wo liegt das Problem? Was muss ich an der Toolchain ändern, damit ich 
für das Arietta Programme erstellen kann?

Gruß,
   SIGINT

von Sigint 112 (sigint)


Lesenswert?

Es läuft!!!  Ich musste mit "-march=armv5" nur die richtige Architektur 
wählen. Gibts ne Möglichkeit die Architektur irgendwo fest in den Linker 
zu verankern?

Gruß,
  SIGINT

von mper (Gast)


Lesenswert?

>Gibts ne Möglichkeit die Architektur irgendwo fest in den Linker
>zu verankern?

Ja. GCC und Binutils sind  Opensource.

von mper (Gast)


Lesenswert?

Mit Makefile oder Script dürfte es allerdings einfacher sein.

von Markus F. (mfro)


Lesenswert?

Sigint 112 schrieb:
> Es läuft!!!  Ich musste mit "-march=armv5" nur die richtige Architektur
> wählen. Gibts ne Möglichkeit die Architektur irgendwo fest in den Linker
> zu verankern?
>
> Gruß,
>   SIGINT

Das ist ja dann wohl ein "multiarch"-gcc?

Welchen Code der erzeugt, wenn -march=xxx beim Compileraufruf fehlt, 
bestimmt die Option "--with-arch=xxx" beim configure des Compilers.

von Sigint 112 (sigint)


Lesenswert?

Hmm.. so gut kenn ich mich nicht aus. Ich dachte bis jetzt, daß es nur 
die ARM Architektur gibt und dann verschiedene Versionen von 
Befehlssätzen. Komischerweise kennt der Linux Kern nur ARCH=arm. Ich 
muss mich mal weiter einlesen. Danke für die Infos.

Gruß,
  SIGINT

von Marius W. (mw1987)


Lesenswert?

Sigint 112 schrieb:
> Komischerweise kennt der Linux Kern nur ARCH=arm.

Der Linux-Kern kennt sehr wohl alle ARM-Varianten. Wenn du mal unter 
arch/arm/Makefile guckst, dann findest du dort eine Reihe von 
Compiler-Optionen, die abhängig von der Kernel-Konfiguration gesetzt 
werden. Da der ARM-GCC sehr generisch ist und meist viele ARM-Varianten 
unterstützt, müssen halt entsprechende Optionen übergeben werden.

Gruß
Marius

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.