Forum: Compiler & IDEs Illegal Instruction mit crosstools ARM XScale Toolchain


von Michael (Gast)


Lesenswert?

Moin,

ich habe ein Problem (naja sonst würde ich ja nicht schreiben).

Ich brauch eine Toolchain um Code für einen fertigen Router zu erzeugen. 
Die Hardware ist ein XScale PXA250 Prozessor mit ARM5 und installiertem 
Linux.

Ich habe eine Toolchain mithilfe der crosstools 
(http://crosstool-ng.org/) erstellt. Bei der Konfiguration habe ich 
darauf geachtet, dass ich ARM auswähle, die FPU auf Software stelle und 
die entsprechenden Linux Header angebe. (Linux Version vom Router und 
die Quellen von kernel.org runtergeladen).

Die Erstellung der Toolchain klappt (mit -mcpu=xscale -mfloat-abi=soft 
-static) aber wenn ich anschließed das Programm ausführe bekomme ich 
eine Illegal Instuction.

Bei dem Vergleich einer Datei auf dem Router mit dem selbst generierten 
HalloWelt Programm erhalte ich noch folgende unterschiede:

Funtionierende Datei des Routers: file init
init: ELF 32-bit LSB executable, ARM, version 1, dynamically linked 
(uses shared libs), for GNU/Linux 2.2.0, stripped

Mein Programm: file a.out
a.out: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically 
linked, not stripped

Funtionierende Datei des Routers: readelf -h init
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 00 00
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            ARM
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x9890
  Start of program headers:          52 (bytes into file)
  Start of section headers:          26244 (bytes into file)
  Flags:                             0x2, has entry point, GNU EABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         6
  Size of section headers:           40 (bytes)
  Number of section headers:         27
  Section header string table index: 26

Mein Programm: file a.out
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x80b0
  Start of program headers:          52 (bytes into file)
  Start of section headers:          45868 (bytes into file)
  Flags:                             0x5000002, has entry point, 
Version5 EABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         4
  Size of section headers:           40 (bytes)
  Number of section headers:         22
  Section header string table index: 19


Hat jemand ne Ahnung woran es liegen kann und eine Idee? Ich vermute die 
AS/ABI Version und suche da gerade (mit wenig erfolg) weiter...

Ich würde mich für jeden Tip freuen...

Mfg Michael

von hp-freund (Gast)


Lesenswert?

Hast Du auch alle Progs mit ihrem Vornamen erstellt und aufgerufen?

Also: arm-...-gcc nicht gcc, arm-...-readelf und nicht readelf

  OS/ABI:ARM <> OS/ABI:UNIX - System V

von Michael (Gast)


Lesenswert?

Hi,

zur erstellung des Programms habe ich alle mit dem richtigen prefix 
aufgerufen.

Ich habe gerade eine ganz alte Toolchain von einem entwicklungsboard 
ausprobiert und hier kommt das problem nicht... hier wird auch die 
richtige OS/ABI version angezeigt (ARM geht UNIX - System V nicht)...

Also liegt es daran... ich muss es hinbekommen mit der neuen generierten 
Toolchain Programme mit dieser option erstellen...

Ich habe im Internet geschaut aber noch nicht viel dazu gefunden...

Wenn jemand eine Idee hat wie ich diese änderung hinbekomme freue ich 
mich weiterhin...

Ich suche auch weiter und wenn ich die Lösung habe lasse ich es auch 
wissen...

Mfg

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wie heißt denn dein Compiler?  arm-*-eabi-gcc oder arm-*-elf-gcc?

Wobei: die Legalität des generierten Codes sollte eigentlich unabhängig
vom Binärformat sein.

von Michael (Gast)


Lesenswert?

Hey,

die "alte" aber funtionierende Toolchain hat das Prefix 
arm-unknown-linux-gnu-*.

Die neue generierte mit den neuen Versionen von binutils gcc und glibc 
trägt das prefix arm-unknown-linux-eabi-*

hm durch welche genaue einstellung wird dieses definiert?

Mfg

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Michael schrieb:
> hm durch welche genaue einstellung wird dieses definiert?

./configure --target=..., also beim Bauen des Compilers.

von hp-freund (Gast)


Lesenswert?

Ist schon wieder eine Weile her, aber ich glaube ich hatte als Grundlage 
benutzt und die jeweils neuesten Versionen der Progs eingetragen.

http://hermann-uwe.de/files/build-arm-toolchain

von der Seite:

http://www.hermann-uwe.de/blog/building-an-arm-cross-toolchain-with-binutils-gcc-newlib-and-gdb-from-source

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.