Bestimmen der Ziel-ISA-Erweiterungen von binären Datei in Linux (Bibliothek oder ausführbare Datei)
Wir haben ein Problem mit einer Java-Anwendung läuft unter einer (ziemlich alten) FC3 auf einem Advantech POS-board mit einem Via-C3-Prozessor. Die java-Applikation hat mehrere kompilierte shared-libs zugegriffen wird über JNI.
Via-C3-Prozessor soll i686 kompatibel. Vor einiger Zeit habe nach der Installation von Ubuntu 6.10 auf einem MiniItx board mit dem gleichen Prozessor, fand ich heraus, dass die Vorherige Aussage ist nicht 100% wahr. Der Ubuntu-kernel gehängt auf startup durch den Mangel an einige spezielle und optionale Anweisungen für die i686-set in der C3-Prozessor. Diese Anleitung fehlt in C3 Umsetzung i686-Satz verwendet standardmäßig den GCC-compiler bei der Verwendung i686-Optimierungen. Die Lösung war in diesem Fall, gehen Sie mit einem i386 kompilierte version der Ubuntu-distribution.
Den base-problem mit Java-Anwendung ist, dass der FC3-distribution installiert wurde, auf die HD Klonen, um aus einem Bild von der HD von einem anderen PC, dieses mal ein Intel P4. Danach werden die Verteilung benötigt einige Hacker haben es ausgeführt, wie das ersetzen einige Pakete (z.B. der kernel) mit der i386 kompilierte version.
Das problem ist, dass nach der Arbeit für eine Weile das system komplett hängt, ohne eine Spur. Ich fürchte, dass einige i686 code bleibt irgendwo im system und können ausgeführt werden, nach dem Zufallsprinzip zu jeder Zeit (zum Beispiel nach dem wiederherstellen aus dem suspend-Modus oder so ähnlich).
Meine Frage ist:
- Gibt es irgendein tool oder eine Möglichkeit, um herauszufinden, was Ihre spezifische Architektur-Erweiterungen eine binäre Datei (ausführbare Datei oder Bibliothek) benötigt?
file
nicht genug Informationen geben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, Sie brauchen ein tool, das prüft jeder Anweisung, um zu bestimmen, genau welche Gruppe er gehört. Gibt es auch eine amtliche Bezeichnung für den spezifischen Satz von Anweisungen implementiert, die von der C3 Prozessor? Wenn nicht, ist es auch hairier.
Eine schnelle Lösung Variante sein könnte, um zu tun, eine raw-Suche in der Datei, wenn Sie ermitteln können, die bit-Muster der nicht zugelassenen Anweisungen. Testen Sie einfach die für Sie direkt, könnte durch eine einfache
objdump | grep
Kette, zum Beispiel.objdump -x <file> | grep Architektur: | cut --delimiter=" " -f 2 | cut --delimiter="," -f 1
Unix.linux
file
Befehl ist ideal für diese. Es kann in der Regel erkennen die Ziel-Architektur und Betriebssystem für eine bestimmte binäre (und gepflegt wurde-und ausschalten seit 1973. wow!!!)Natürlich, wenn Sie nicht unter unix/linux - Sie sind ein bisschen festgefahren. Ich bin derzeit auf der Suche nach einem java-basierten Anschluss, der ich anrufen kann zur Laufzeit.. aber kein solches Glück.
Unix
file
Befehl gibt Informationen, wie diese:Mehr detaillierte Informationen über die details der Architektur sind angedeutet mit dem (unix -)
objdump -f <fileName>
Befehl gibt:Diese ausführbare Datei kompiliert wurde durch einen gcc-cross-compiler (kompiliert auf einem i86-Maschine für den ARM-Prozessor als Ziel)
objdump: Unknown command line argument '-f'. Try: 'objdump -help'
Ich entscheiden, fügen Sie eine weitere Lösung für jeden, der bekam hier: persönlich in meinem Fall die Angaben des
file
undobjdump
war nicht genug, und diegrep
nicht viel helfen -- ich löse meinen Fall durch diereadelf -a -W
.Beachten Sie, dass dies gibt Ihnen ziemlich viel info. Der Bogen Verwandte Informationen befindet sich in den Anfang und das Ende. Hier ist ein Beispiel:
readelf -A
Zu beantworten, die Zweideutigkeit, ob ein Via C3 ist eine i686-Prozessor: Es ist nicht, es ist eine i586-Prozessor.
Cyrix nie produziert eine wahre 686-Prozessor, trotz Ihrer Behauptungen mit dem 6x86MX-und MII-Teile. Unter anderen fehlenden Anweisungen, zwei wichtige diejenigen, die Sie nicht haben, waren CMPXCHG8b und CPUID, die erforderlich waren, um die Ausführung von Windows XP und darüber hinaus.
National Semiconductor, AMD und VIA haben alle produzierten CPU-designs auf der Basis der Cyrix 5x86/6x86-core (NxP MediaGX, AMD Geode, VIA C3/C7, VIA Corefusion, etc.) geführt haben in der oddball-designs, wo Sie einen 586 Prozessor mit SSE1/2/3-Befehlssätzen.
Meine Empfehlung, wenn Sie auf eine der CPUs aufgeführt ist, und es nicht für einen vintage-computer-Projekt (dh. Windows 98SE und vor) und dann schreiend von ihm Weg. Sie werden aufgeklebt werden langsam i386/486 Linux-oder neu kompilieren müssen alle Ihre software mit Cyrix-spezifische Optimierungen.
Auszubauen @Hallo-Angel ' s Antwort, die ich einen einfachen Weg gefunden, überprüfen Sie die bit-Breite von einer statischen Bibliothek:
Wo
libsomefile.a
ist meine statische Bibliothek. Sollten für die anderen ELF-Dateien sowie.Schnellste Sache zu finden, die Architektur wäre die Ausführung:
Dies funktioniert auch, für binäre.
objdump: Unknown command line argument '-f'. Try: 'objdump -help'