Bestimmen Ziel ISA-Erweiterungen von Binär-Datei in Linux (Bibliothek oder ausführbar)
-
06-07-2019 - |
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.
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.