cannot execute binary file

OP (Firma: Qimonda) #1053187
Lesenswert?

Hallo GCC-Gemeinde,

ich steh ein bischen auf dem Schlauch! Seit einer Woche bin ich stolzer 
Besitzer eines Olimex SAM9-L9260 mit ARM9 Prozessor. Linux läuft super 
auch über SSH und sonst ist alles richtg gut.

Nun wollte ich mal mit dem arm-elf-gcc das obligatorische HelloWorld 
übersetzen und per SCP rüberschieben geht alles wunderbar. Ohne 
besondere Kommandozeilenoptionen, also mit
1
arm-elf-gcc -mcpu=arm9 -o hello.o hello.c

bekomm ich erst mal eine riesen Datei (180k). Bischen arg groß für ein 
HelloWorld Test. Wenn ich das rüber aufs Board kopiere dann die rechte 
setze und es mir ./hello.o oder sh hello.o starten will, dann kommt nur 
Illegal instruction?

Gut also mal ins Makefile vom yagarto Test-Beispiel geschaut und noch 
ein paar Kommandozeilenoptionen dazugeschrieben
1
arm-elf-gcc -mcpu=arm9 -Oo -gdwarf-2 -mthumb-interwork -fomit-frame-pointer 
2
-Wall -Wstrict-prototypes -verbose-asm -MD -MP -I . -I ./inc -o hello.o hello.c

dann wird die hollo.o zwar nur noch rund 1.8k groß. Sieht schon mal gut 
aus. Aber nach dem rüberkopieren bekomm ich dann:

cannot execute binary file

Habt ihr ne Ahnung, was ich da falsch mache?

Gruß Tilo
OP (Firma: Qimonda) #1053538
Lesenswert?

Hmm das stimmt, mit dem Linker, das hab ich jetzt auch mitbekommen. 
Allerdings sollte dann doch der arm-elf-gcc compiler wenn ich alle 
optionen weglasse also nur mit
1
arm-elf-gcc -mcpu=arm9 hello.c

doch den ganzen build pfad durchlaufen, also

Preprocessing --> Compiling --> Assembling --> Linking

und dann automatisch eine elf Datei schmeißen. Tut er aber nicht, 
sondern eine a.out. und dies ist offensichtlich ein binary-File und kein 
executable.

eh ich steh total auf'm schlauch!

gruß
OP (Firma: Qimonda) #1053624
Lesenswert?

Hmm file war ne gute idee, allerdings wird dann komplett verrückt, denn 
es erkennt offenbar, dass es sich um eine Executable handelt.
1
ELF 32-bit LSB executable, ARM, version 1 (ARM), statically linked, not stripped

aber dennoch beim starten bekomm ich eine
1
Illegal instruction

kommt schon, einer muß es doch wissen!
Gast #1053642
Lesenswert?

Gesprächiger als file ist readelf. Wende doch einmal
1
arm-elf-readelf -h

auf

  - das von dir selbst kompilierte Programm und

  - ein fertiges Programm aus der Linux-Installation des Zielsystems

an und vergleiche die Ausgaben.

Für die ARMs gibt es ja unterschiedliche Befehlssätze und Datenformate
(normal/thumb, little-endian/big-endian). Ohne mich mit den ARMs gut
auszukennen, vermute ich, dass nicht alle Formate vom Zielsystem
unterstützt werden.
Persönliche Seite #1053647
Lesenswert?

Entscheide dich doch mal, welche Fehlermeldung jetzt wirklich kommt.

#1 "Illegal instruction" oder #2 "cannot execute binary file"

Bei #1 erkennt Linux ein execute binary file, d.h. einen übersetzten und 
gelinkten Quellcode. Aber der ist für den Zielprozessor nicht richtig 
übersetzt und wirft deshalb bei der Ausführung einen Fehler.

Bei #2 hast du kein execute binary file, sondern z.B. nur eine 
Objektdatei, die noch mit den Libraries zu verlinken wäre. Die 
Fehlermeldung kommt, wenn Linux sich die Datei ansieht, um sie zu 
starten. Es kann passieren, dass du nach der Korrektur von #2 bei #1 
landest.
Gast #1053678
Lesenswert?

> Bei #2 hast du kein execute binary file, sondern z.B. nur eine
> Objektdatei, die noch mit den Libraries zu verlinken wäre.

Oder ein Executable, das für ein anderes Zielsystem kompiliert und
gelinkt wurde.
OP (Firma: Qimonda) #1053708
Lesenswert?

Also erst mal vielen Dank für die Unterstützung. Der beschränken wir uns 
mal auf Fehler #1. So und der Tipp mit arm-elf-readelf -h war gut. Aber 
nun seht selbst. aus hallo.c -->
1
ELF Header:
2
  Magic:   7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 00 00 
3
  Class:                             ELF32
4
  Data:                              2's complement, little endian
5
  Version:                           1 (current)
6
  OS/ABI:                            ARM
7
  ABI Version:                       0
8
  Type:                              EXEC (Executable file)
9
  Machine:                           ARM
10
  Version:                           0x1
11
  Entry point address:               0x8100
12
  Start of program headers:          52 (bytes into file)
13
  Start of section headers:          261348 (bytes into file)
14
  Flags:                             0x2, has entry point, GNU EABI
15
  Size of this header:               52 (bytes)
16
  Size of program headers:           32 (bytes)
17
  Number of program headers:         1
18
  Size of section headers:           40 (bytes)
19
  Number of section headers:         24
20
  Section header string table index: 21

und aus einem file vom AT91SAM9260 (Board von olimex im übrigen)
1
ELF Header:
2
  Magic:   7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 00 00 
3
  Class:                             ELF32
4
  Data:                              2's complement, little endian
5
  Version:                           1 (current)
6
  OS/ABI:                            ARM
7
  ABI Version:                       0
8
  Type:                              EXEC (Executable file)
9
  Machine:                           ARM
10
  Version:                           0x1
11
  Entry point address:               0x9b28
12
  Start of program headers:          52 (bytes into file)
13
  Start of section headers:          56080 (bytes into file)
14
  Flags:                             0x2, has entry point, GNU EABI
15
  Size of this header:               52 (bytes)
16
  Size of program headers:           32 (bytes)
17
  Number of program headers:         6
18
  Size of section headers:           40 (bytes)
19
  Number of section headers:         24
20
  Section header string table index: 23

So richtig seh ich da keine unterschiede. :-(
Gast #1053727
Lesenswert?

Gabs da nicht nen unterschied zwischen den einzelnen Compilervarianten, 
einer für Linuxbinaries [gcc-arm-linux oder so] und der andere für 
standaloneanwendungen? Schliesslich wird ja anders gelinkt (oder so ;) )
OP (Firma: Qimonda) #1053753
Lesenswert?

Ahh, richtig, also schnell das Manual vom Board zur Hand, da war doch 
irgendwas:
1
$ PATH=$PATH:/usr/local/arm/4.1.1-920t/bin
2
$ cat > hello.c
3
#include <stdio.h>
4
int main(void)
5
{
6
unsigned int i;
7
printf("\r\nProba proba ");
8
for (i=0; i<10; i++)
9
printf("\r\n%d", i);
10
return 0;
11
}
12
^D
13
$ arm-linux-gcc -o hello hello.c
14
$ cp hello ~/htdocs/
15
----- On the board -----
16
~ # wget http://192.168.0.xx/hello
17
~ # chmod 777 hello
18
~ # ./hello
19
Proba proba
20
01
21
....

wer lesen kann ist klar im Vortei! Eine Frage bleibt dann aber noch, 
gibt es den arm-linux-gcc auf für Windows (also ohne aufwendige cygwin 
installation)? Ist hat in der Firma etwas schwierig ein linux mal 
schnell installieren zu lassen. Bürokratie usw. Na ja.

Gruß und danke
OP (Firma: Qimonda) #1053767
Lesenswert?

Danke Thomas, werds mal ausprobieren, wenns nicht funzt kann ich immer 
noch auf ne Linux Distribution zurückgreifen.

Im Übrigen: arm-elf-gcc ist der cross-compiler von yatargo, allerdings 
nur für die hardware-nahe-kompilierung. Ich erinnere mich an die ersten 
versuche damit, d.h. mittels JTAG auf die Hardware geladen und debugt 
hat wunderbar funktioniert.

Für stand-alone Anwendungen auf dem embedded-Linux ist aber 
höchstwahrscheilich der arm-linux-gcc zu verwenden. wenigstens noch was 
gelernt heute :-D

Gruß an alle und ich hoffe so könnte es nun funktionieren.

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