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


24

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 möchte wissen, ob ein Computer eine ausführbare Datei ausführen kann: Mit anderen Worten, ich habe eine Binärdatei und muss sie auf 32-Bit-Ubuntu ausführen, aber ich weiß nicht, ob die Binärdatei eine ausführbare 32-Bit-Datei ist .

Ich habe den fileBefehl verwendet und die ausführbare Datei angegeben, die überprüft werden soll, und dies war das zurückgegebene Ergebnis:

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

Antworten:


29

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

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

ELF ist das ausführbare und verknüpfbare Format , das von Linux am häufigsten verwendete ausführbare Binärdateiformat.

x86-64 ist die Architektur der Binärdatei, der 64-Bit-Version des ursprünglich von AMD eingeführten x86-Befehlssatzes . Aus Gründen, die mir unverständlich sind, nennt Microsoft es "x64", aber das ist das Gleiche.

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

Das bedeutet, dass ich einen x86-64-Kernel verwende.

Wenn Sie an der CPU selbst interessiert sind, informieren Sie sich /proc/cpuinfoüber die vom Linux-Kernel erkannten CPUs.

Eine ausführbare 32-Bit-80x86-Datei wird beispielsweise folgendermaßen identifiziert file:

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 dies nicht ganz so einfach ist wie bei 32-Bit- oder 64-Bit-Architekturen. Zum Beispiel der Linux - Kernel unterstützt 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 zum Ziel haben). 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 .


1
"Gründe, die mir verborgen bleiben". Ich erinnere mich noch an den Tag, an dem ich herausfand, dass x64 64-Bit und x86 32-Bit waren.
Paul Draper

1
@PaulDraper Der Begriff "x86" hat eine klare Etymologie. Es geht auf die 80x86-CPUs von Intel zurück und unterscheidet sie von ihren Vorgängern wie dem 8008 oder 8080. Heutzutage wird am häufigsten auf die 32-Bit-fähigen (IA-32-Befehlssatz) Varianten (80386, 80486, Pentium und neuer) verwiesen ). Diese neueren Modellnummern wurden häufig durch Weglassen der "80" am Anfang abgekürzt, sodass (implizite 32-Bit) x86 mit 386, 486 usw. übereinstimmt. Allerdings sind mir keine 64-Bit-CPUs mit Modellnummern von bekannt eine ähnliche Struktur, die mit "64" endet; Weder AMD noch Intel verwenden heute ein solches Namensschema.
ein Lebenslauf vom

Obwohl x64 ist ein sehr gebräuchlicher Begriff. Zufälliges Beispiel: microsoft.com/en-us/download/details.aspx?id=42482
Paul Draper

@PaulDraper Es ist jetzt in der Microsoft-Welt üblich, aber seine Etymologie bleibt in einer Weise unklar, die das für "x86" nicht tut.
ein CVn

Microsoft bezeichnet x86_64 in seinen Installationsprogrammen als AMD64
phuclv

7

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

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

od -t x1 -t c foo | head -n 2

2

Wenn Sie das "Kopf" -Rohr vermeiden möchten, können Sie dies tun

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

Dies gibt 01 aus, wenn es sich bei foo um eine 32-Bit-Binärdatei handelt, und 02, wenn es sich um eine 64-Bit-Binärdatei handelt. Möglicherweise enthält sie noch einige führende Leerzeichen.

Wenn dies in einem einfachen Ubuntu Docker-Container nützlich ist, in dem 'file' nicht installiert wurde.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.