Linuxバイナリファイルが32ビットか64ビットかを判断する方法


24

32ビットカーネル(x86)は、32ビットコードのみを実行できます。64ビットカーネル(x86_64)は、32ビットコードと64ビットコードの両方を実行できます。

マシンが実行可能ファイルを実行できるかどうかを知りたいのです。つまり、バイナリファイルがあり、32ビットUbuntuで実行する必要がありますが、バイナリファイルが32ビット実行可能ファイルかどうかはわかりません。 。

fileチェックする実行可能ファイルを指定してコマンドを使用しましたが、これが返された結果です。

ELF 64ビットLSB実行可能ファイル、x86-64、バージョン1(SYSV)、動的リンク(共有ライブラリを使用)、GNU / Linux 2.6.24、BuildID [sha1] = 0x7329fa71323a6cd64823c2594338682065cd6e07、ストリップなし

回答:


29

タイトルの質問に対する答えは、出力の先頭にあります。

ELF 64ビット LSB実行可能ファイル、x86-64

ELFは、Linuxで最も一般的に使用されるバイナリ実行可能ファイル形式である実行可能およびリンク可能形式です。

x86-64は、AMDによって最初に導入さたx86命令セット64ビットバージョンであるバイナリのアーキテクチャです。私を超えた理由から、Microsoftは「x64」と呼んでいますが、それは同じことです。

カーネル自体のアーキテクチャを知る必要がある場合は、を使用できますuname -mpi。たとえば、私のシステムでは、次のように出力されます。

x86_64不明不明

つまり、x86-64カーネルを実行しています。

CPU自体に興味がある場合/proc/cpuinfoは、Linuxカーネルによって検出されたCPUの詳細を確認してください。

32ビットの80x86実行可能ファイルはfile、たとえば次のように識別されます。

ELF 32ビット LSB実行可能ファイル、Intel 80386、バージョン1(SYSV)、動的にリンク(共有ライブラリを使用)、GNU / Linux 2.6.8用、ストリップ済み

これは、Intel 80386命令セットを使用した32ビットの実行可能ファイルであることを示しています(おそらく拡張機能付き)。

32ビットアーキテクチャと64ビットアーキテクチャほど単純ではないことに注意してください。たとえば、Linuxカーネルは Intel 80386、AVR32S / 390Unicore32などの32ビットアーキテクチャをサポートしています。64ビット側では、Linuxは特にPA-RISC、x86-64、ItaniumおよびAlphaで使用できます。ただし、すべてのディストリビューションがすべてのアーキテクチャのバイナリを提供するわけではありません(サポートされているすべての CPUアーキテクチャを等しくターゲットとするディストリビューションがあるとは思いません)。そのため、特定のバイナリが特定のシステムで実行可能かどうかを知りたい場合は、CPUのネイティブワードサイズではなく、アーキテクチャを考慮する必要があります。


1
「私の向こうにある理由」。x64が64ビットで、x86が32ビットであることがわかった日を今でも覚えています。
ポールドレーパー14

1
@PaulDraper「x86」という用語には明確な語源があります。Intelの80x86シリーズCPUにまでさかのぼり、8008や8080などの前身と区別し、最近ではほとんどの場合32ビット(IA-32命令セット)対応バリアント(80386、80486、Pentium以降を指します) )。これらの最近のモデル番号は、先頭の「80」を省略することでしばしば省略されたため、(暗黙の32ビット)x86は386、486などに一致します。しかし、モデル番号の64ビットCPUは認識していません。 「64」で終わる同様の構造。確かにAMDもIntelも今日このような命名法を使用していません。
CVn

ただし、x64 非常に一般的な用語です。ランダムな例:microsoft.com/en-us/download/details.aspx
ポールドレイパー

@PaulDraper マイクロソフトの世界ではでは一般的ですが、その語源は「x86」の場合とは異なり不明のままです。
CVn

Microsoftは、インストーラーでx86_64をAMD64と
呼んでいます-phuclv

7

Linuxバイナリ実行可能ファイル(ELF形式、Wikipediaを参照)の5バイト目は、32ビット実行可能ファイルでは1、64ビット実行可能ファイルでは2です。

「foo」という名前のプログラムでこれを確認するには、コマンドラインで入力します

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

2

「ヘッド」パイプを避けたい場合は、次のことができます

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

これは、fooが32ビットバイナリの場合は01を出力し、64の場合は02を出力します。まだいくつかの先行スペースが含まれている可能性があります。

'file'がインストールされていない基本的なUbuntu Dockerコンテナーでこれが便利な場合。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.