Frage

Wir haben eine auf eine Java-Anwendung beantwortet unter einem (eher alt) läuft FC3 auf einer Advantech POS-Board mit einem Via C3-Prozessor. Die Java-Anwendung hat mehr gemeinsam genutzte Bibliotheken zusammengestellt, die über JNI zugegriffen werden kann.

Via C3 Prozessor soll i686 kompatibel sein. Vor einiger Zeit nach Ubuntu 6.10 auf einer Mini-ITX-Board mit dem gleichen Prozessor installieren, fand ich heraus, dass die bisherige Aussage nicht zu 100% wahr ist. Der Ubuntu-Kernel aufgrund des Fehlens einiger spezifischer und optional Anweisungen des i686 beim Start hängen gesetzt in der C3-Prozessor. Diese Anweisungen in C3 Implementierung von i686 Satz fehlen werden standardmäßig von GCC-Compiler verwendet, wenn i686 Optimierungen verwenden. Die Lösung, in diesem Fall war mit einer i386 kompilierte Version von Ubuntu-Distribution zu gehen.

Das Basis Problem mit der Java-Anwendung ist, dass die FC3 Verteilung auf der HD installiert wurde von einem Bild des HD von einem anderen PC Klonen, diesmal ein Intel P4. Danach benötigt die Verteilung einige es läuft wie zu ersetzen einige Pakete (wie der Kernel eins) mit dem i386 kompilierte Version haben Hacking.

Das Problem ist, dass für eine Weile nach der Arbeit des System hängt völlig spurlos. Ich fürchte, dass einiger i686 Code irgendwo im System belassen wird und zufällig (zum Beispiel nach dem aus dem Suspend-Modus oder so etwas erholt) jederzeit ausgeführt werden kann.

Meine Frage ist:

  • Gibt es ein Werkzeug oder eine Art und Weise zu welchen spezifischen Architekturerweiterungen, um herauszufinden, erfordert eine binäre Datei (ausführbare Datei oder Bibliothek)? file nicht gibt genügend Informationen.
War es hilfreich?

Lösung

Ich glaube, Sie ein Werkzeug benötigen, das jede Anweisung überprüft, genau zu bestimmen, welche eingestellt es gehört. Gibt es auch eine offizielle Name für den speziellen Satz von Anweisungen durch den C3-Prozessor implementiert? Wenn nicht, ist es noch haariger.

Eine quick'n'dirty Variante könnte sein, eine rohe Suche in der Datei zu tun, wenn Sie das Bitmuster der nicht anerkannten Anweisungen bestimmen können. direkt testen für sie nur durch eine einfache objdump | grep Kette, zum Beispiel getan werden könnte.

Andere Tipps

Der unix.linux file Befehl ist für diesen. Es kann in der Regel die Zielarchitektur und Betriebssystem für einen bestimmten binären erkennen (und ist seit 1973 ein und aus wow gepflegt!)

Natürlich, wenn Sie nicht unter Unix / Linux laufen - du bist ein bisschen stecken. Ich versuche zur Zeit ein Java-basiert Port zu finden, die ich zur Laufzeit aufrufen kann .. aber kein Glück.

Der Unix file Befehl Informationen wie diese gibt:

hex: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.4.17, not stripped

Weitere Informationen über die Details der Architektur angedeutet, an dem (Unix) objdump -f <fileName> Befehl, der zurückgibt:

architecture: arm, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x0000876c

Diese ausführbare Datei durch einen gcc Kreuzcompiler (zusammengestellt auf einer i86 Maschine für den ARM-Prozessor als Ziel) kompiliert wurde

Ich entscheide, eine weitere Lösung für alle an, das hier bekam: persönlich in meinem Fall die Information durch die file und objdump war nicht genug zur Verfügung gestellt, und die grep ist nicht viel geholfen - ich meinen Fall lösen durch die readelf -a -W.

Beachten Sie, dass diese Sie ziemlich viel Informationen gibt. Die Bogen bezogenen Informationen liegen in dem Anfang und das Ende. Hier ein Beispiel:

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:               0x83f8
  Start of program headers:          52 (bytes into file)
  Start of section headers:          2388 (bytes into file)
  Flags:                             0x5000202, has entry point, Version5 EABI, soft-float ABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         8
  Size of section headers:           40 (bytes)
  Number of section headers:         31
  Section header string table index: 28
...
Displaying notes found at file offset 0x00000148 with length 0x00000020:
  Owner                 Data size   Description
  GNU                  0x00000010   NT_GNU_ABI_TAG (ABI version tag)
    OS: Linux, ABI: 2.6.16
Attribute Section: aeabi
File Attributes
  Tag_CPU_name: "7-A"
  Tag_CPU_arch: v7
  Tag_CPU_arch_profile: Application
  Tag_ARM_ISA_use: Yes
  Tag_THUMB_ISA_use: Thumb-2
  Tag_FP_arch: VFPv3
  Tag_Advanced_SIMD_arch: NEONv1
  Tag_ABI_PCS_wchar_t: 4
  Tag_ABI_FP_rounding: Needed
  Tag_ABI_FP_denormal: Needed
  Tag_ABI_FP_exceptions: Needed
  Tag_ABI_FP_number_model: IEEE 754
  Tag_ABI_align_needed: 8-byte
  Tag_ABI_align_preserved: 8-byte, except leaf SP
  Tag_ABI_enum_size: int
  Tag_ABI_HardFP_use: SP and DP
  Tag_CPU_unaligned_access: v6

Um die Mehrdeutigkeit zu beantworten, ob ein Via C3 ist ein i686-Prozessor. Es ist nicht, es ist ein i586-Prozessor

Cyrix produzierte nie einen echten 686-Prozessor, trotz ihrer Marketing-Ansprüche mit dem 6x86MX und MII Teilen. Unter anderem fehlt Anweisungen, zwei tigeren haben sie nicht waren, haben CMPXCHG8B und CPUID, die Windows XP erforderlich waren, laufen und darüber hinaus.

National Semiconductor, AMD und VIA haben alle Entwürfe produziert CPU basierend auf dem Cyrix 5x86 / 6x86 Kern (NXP MediaGX, AMD Geode, VIA C3 / C7, VIA Corefusion usw.), die in oddball Designs geführt haben, wo Sie eine haben 586-Prozessor mit SSE1 / 2/3-Befehlssätzen.

Meine Empfehlung, wenn Sie kommen über jeden der aufgeführten CPUs oben und es ist nicht für einen Vintage Computer-Projekt (dh. Windows 98SE und vor), dann von ihm laufen schreiend weg. Sie werden auf langsamen i386 / 486 Linux stecken oder haben alle Ihre Software mit Cyrix spezifischen Optimierungen neu kompiliert werden.

Die Erweiterung auf @ Hallo-Angel Antwort fand ich eine einfache Möglichkeit, die Bitbreite einer statischen Bibliothek zu überprüfen:

readelf -a -W libsomefile.a | grep Class: | sort | uniq

Wo libsomefile.a ist meine statische Bibliothek. Sollte auch für andere ELF-Dateien arbeiten.

Schnellste, was Architektur zu finden wäre auszuführen:

objdump -f testFile | grep architecture

Dies funktioniert auch für binäre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top