Wie kann ich feststellen, ob eine Linux-Binärdatei 32-Bit oder 64-Bit ist?

40567
enzom83

Ein 32-Bit-Kernel (x86) kann nur 32-Bit-Code ausführen. Ein 64-Bit-Kernel (x86_64) kann sowohl 32-Bit- als auch 64-Bit-Code ausführen.

Ich würde gerne wissen, ob eine Maschine eine ausführbare Datei ausführen kann: Mit anderen Worten, ich habe eine Binärdatei und muss diese auf 32-Bit-Ubuntu ausführen, aber ich weiß nicht, ob die Binärdatei eine 32-Bit-Datei ist .

Ich habe den fileBefehl verwendet, um die zu überprüfende ausführbare Datei anzugeben, und dies war das zurückgegebene Ergebnis:

ELF-64-Bit-LSB-Programm, x86-64, Version 1 (SYSV), dynamisch verknüpft (verwendet freigegebene Bibliotheken), für GNU / Linux 2.6.24, BuildID [sha1] = 0x7329fa71323a6cd64823c2594338682065cd6e07, nicht entfernt

15

3 Antworten auf die Frage

18
a CVn

Die Antwort auf die Frage im Titel steht am Anfang der Ausgabe:

ELF 64-Bit- LSB-Programm, x86-64

ELF ist das ausführbare und verknüpfbare Format, das binäre ausführbare Dateiformat, das am häufigsten von Linux verwendet wird.

x86-64 ist die Architektur der binären, 64-Bit-Version des ursprünglich von AMD eingeführten x86-Befehlssatzes . Aus Gründen, die über mich hinausgehen, bezeichnet Microsoft es als "x64", aber das ist dasselbe.

Wenn Sie die Architektur des Kernels selbst kennen müssen, können Sie verwenden uname -mpi. Auf meinem System wird beispielsweise Folgendes gedruckt:

x86_64 unbekannt unbekannt

was bedeutet, dass ich einen x86-64-Kernel betreibe.

Wenn Sie an der CPU selbst interessiert sind, schauen Sie /proc/cpuinfonach Details zu den vom Linux-Kernel erkannten CPU (s).

Eine ausführbare 32-Bit-Datei mit 80x86 wird filezum Beispiel wie folgt identifiziert :

ELF- 32-Bit- LSB- Programm, Intel 80386, Version 1 (SYSV), dynamisch verknüpft (verwendet gemeinsam genutzte Bibliotheken), für GNU / Linux 2.6.8, entfernt

Dies sagt uns, dass es sich um eine 32-Bit-ausführbare Datei handelt, die den Intel 80386-Befehlssatz verwendet (möglicherweise mit Erweiterungen).

Beachten Sie, dass es nicht ganz so einfach ist wie 32-Bit- oder 64-Bit-Architekturen. Zum Beispiel unterstützt die Linux - Kernel 32-Bit - Architekturen wie Intel 80386, AVR32, S / 390 und Unicore32 . Auf der 64-Bit-Seite ist Linux unter anderem auf PA-RISC, x86-64, Itanium und Alpha einsetzbar . Allerdings bieten nicht alle Distributionen Binärdateien für alle Architekturen (und ich bezweifle, dass es Distributionen gibt, die alle unterstützten CPU-Architekturen gleichermaßen betreffen). Wenn Sie also wissen möchten, ob eine bestimmte Binärdatei auf einem bestimmten System ausführbar ist, müssen Sie die Architektur und nicht die native Wortgröße der CPU berücksichtigen .

"Gründe, die über mich hinausgehen". Ich erinnere mich noch an den Tag, an dem ich herausfand, dass x64 64 Bit und x86 32 Bit betrug. Paul Draper vor 10 Jahren 1
@PaulDraper Der Begriff "x86" hat eine klare Etymologie. Sie geht auf die 80x86-CPUs von Intel zurück und unterscheidet sich von ihren Vorgängern wie dem 8008 oder 8080. Heutzutage werden meistens die 32-Bit-Varianten (IA-32-Befehlssatz) (80386, 80486, Pentium und neuer) verwendet ). Diese neueren Modellnummern wurden häufig abgekürzt, indem anfangs die "80" weggelassen wurde, so dass (implizierte 32-Bit) x86 mit 386, 486 usw. übereinstimmt. Ich kenne jedoch keine 64-Bit-CPUs mit der Modellnummer eine ähnliche Struktur, die auf "64" endet; sicherlich verwenden heute weder AMD noch Intel ein solches Namensschema. a CVn vor 8 Jahren 1
Obwohl x64 * ein sehr gebräuchlicher Begriff ist. Zufälliges Beispiel: https://www.microsoft.com/de-de/download/details.aspx?id=42482 Paul Draper vor 8 Jahren 0
@PaulDraper Es ist * jetzt * in der Microsoft-Welt üblich, aber seine Etymologie bleibt in einer Weise unklar, dass dies für "x86" nicht der Fall ist. a CVn vor 8 Jahren 0
Microsoft bezieht sich in seinen Installationsprogrammen auf x86_64 als AMD64 phuclv vor 6 Jahren 0
@ αCVn Intel verwendet IA64 für Itanium, den ersten 64-Bit-Befehlssatz von Intel, der vollständig mit 'älteren' x86-Prozessoren inkompatibel war. Intel wollte wirklich, dass es sich dabei um den 64-Bit-Befehlssatz handelt, den alle verwendeten, und so wurde Intel Architecture 64-Bit genannt, wobei der Schwerpunkt darauf lag, dass er der einzige war. IA64 hat den 64-Bit-ISA-Krieg verloren und ist jetzt veraltet. Möglicherweise stoßen Sie jedoch auf IA64-Code. Intel nennt den modernen 64-Bit-x86_64-Prozessor, da es sich um die 64-Bit-Erweiterung des von AMD entwickelten x86-Befehlssatzes handelt. So kamen wir zu x86_64. Andy vor 6 Jahren 0
3
Chris Maple

Das 5. Byte einer Linux-Binärdatei (ELF-Format, siehe Wikipedia) ist 1 für eine 32-Bit-Programmdatei, 2 für eine 64-Bit-Programmdatei.

Um dies für ein Programm namens "foo" anzuzeigen, geben Sie in die Befehlszeile ein

od -t x1 -t c foo | head -n 2 
1
Quentin Stafford-Fraser

Wenn Sie das Kopfrohr vermeiden möchten, können Sie dies tun

od -An -t x1 -j 4 -N 1 foo 

Dies gibt 01 aus, wenn foo ein 32-Bit-Binärcode ist, und 02, wenn es 64 ist. Es enthält möglicherweise noch führende Leerzeichen. Es ist wichtig zu wissen, ob Sie automatisierte Vergleiche mit den Ergebnissen durchführen.

Wenn gefunden, dass dies in einem grundlegenden Ubuntu Docker-Container nützlich ist, wo "Datei" nicht installiert wurde.