Windows向けのEXEやDLLが、32bitなのか64bitなのかを調べる方法をいくつか考えてみる
アプリケーションとDLLのビット数が合わないと動かないので、確認方法を把握したいと思った
あるツールのビット数と、そのツールが使うDLLのビット数が合っていないことに気づかず、意外に手間取理ました。そこで EXE や DLL のビット数の確認方法を考察してみることにした。
とりあえず見つけた方法はこんなところ。
- dumpbinコマンドで見る
- バイナリを直接見る
- fileコマンドで見る
- 7zip のコマンドラインツールを使う
この中では、自分の環境では file コマンドでチェックするのが最もよさげ。
dumpbin コマンドで見る
Visual Studio に含まれる dumpbin.exe で見れるらしい。
こんなふうに実行すると、x64 or x86 という情報が出るらしい。
dumpbin.exe /headers ファイル名 | findstr machine
でも、自分の環境には Visual Studio を入れていないので、この方法は取れない。
直接見る
0x80 前後に以下のようなデータの並びを探せばよいそうです。
50 45 00 00 4C 01 = 32bit 50 45 00 00 64 86 = 64bit
うん、わかった。でもちょっとめんどくさい。だけど、データサイスの小さいバイナリなら、notepad や command prompt で more コマンドを使ってこんなふうに上記のデータを探せます。そう考えると、これはこれで追加のツールをインストールできない環境では悪くない方法です。
32-bit の場合
64-bit の場合
file コマンドで見る
macOS, Ubuntu, CentOS, cygwin などに含まれる GNU file コマンドを使えば容易に確認できます。Windows 10 で WSL を入れていれば file コマンドが利用可能です。
EXEはこんなふうに示される。
$ file System32/net.exe SysWOW64/net.exe System32/net.exe: PE32+ executable (console) x86-64, for MS Windows SysWOW64/net.exe: PE32 executable (console) Intel 80386, for MS Windows
DLLも、こんなふうに示される。
$ file System32/winusb.dll SysWOW64/winusb.dll System32/winusb.dll: PE32+ executable (DLL) (console) x86-64, for MS Windows SysWOW64/winusb.dll: PE32 executable (DLL) (console) Intel 80386, for MS Windows
file コマンドはさまざまなファイルのフォーマット判定に利用できるから、これが最も汎用性が高い。
7zコマンドを使用する
7-zip をインストール済みの場合は 7z.exe l some.exe | findstr CPU
のように実行すると "CPU = x86" または "CPU = x64" という結果が取得できるそうです。
実際にやってみると、ごらんのとおり。
C:\>"C:\Program Files\7-Zip\7z.exe" l c:\windows\system32\cmd.exe | findstr CPU CPU = x64 C:\>"C:\Program Files\7-Zip\7z.exe" l c:\windows\syswow64\cmd.exe | findstr CPU CPU = x86 C:\>"C:\Program Files\7-Zip\7z.exe" l c:\windows\system32\winusb.dll | findstr CPU CPU = x64 C:\>"C:\Program Files\7-Zip\7z.exe" l c:\windows\syswow64\winusb.dll | findstr CPU CPU = x86
まとめてみると、調べ方はこんなかんじです。