cannot execute binary file

OP (Firma: Qimonda) #1053187
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)
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)
@Malte:

na ja die Idee kam mir ja als aller erstes und so dachte ich auch sollte 
das funktionieren. Allerdings meckert der ARM9 dann mit eben dieser 
Fehlermeldung aus dem Topic-Namen.

./hello.o: cannot execute binary file

:-(
OP (Firma: Qimonda)
ja ja, sorry hab einmal die Ausgabedatei direkt angegeben
1
 arm-elf-gcc -mcpu=arm9 hello.c -o hello.o

und einmal ohne
1
 arm-elf-gcc -mcpu=arm9 hello.c

beide entstehenden Files (a.out und hello.o) bringen die gleiche 
Fehleremeldung:
Moderator Persönliche Seite
Dann wirst du dich wohl oder übel kundig machen müssen, was genau
dein Linux da als Binärformat benötigt, um es zur direkten Ausführung
zu akzeptieren.  U. U. hilft dir ja das Kommando "file" weiter, um
existierende (tatsächlich lauffähige) Binaries mit dem von dir
erzeugten zu vergleichen.
OP (Firma: Qimonda)
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
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
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
> 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)
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
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)
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)
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.