https://github.com/funatsufumiya/exe-arch-detector

Windows ARM、いわゆるSnapdragon XのノートPCをここ半年ほど愛用しているのだけれど、exeが x86_64 用なのか ARM64 用なのかの判定はすごく大事になる。これをしないとdllの依存関係などがうまく解決できない。

簡単な方法としては git bash 上で file コマンドを使う方法がよく出てくるものの、例えば普通のexeに画像ファイルなどを埋め込んだ lovr などの一部のexeはうまく判定されずzipであると表示されてしまう。

$ file "/c/Users/fu/apps/lovr/lovr"
# /c/Users/fu/apps/lovr/lovr: Zip archive, with extra data prepended

そこで、StackOverflowの回答をもとに、使いやすいよう少しコードを修正した exe-arch-detector を作った。GitHub上にexeを同梱しているので、ダウンロードして実行すれば使える。Releasesのやつも中身は同じ。

実行すると、exeのCOFF headerというものを読み取った結果が表示されて、x64なのかARMなのかがわかる。

一応それ以外のアーキテクチャ、例えばPowerPC用とかでも読み取れるらしいけど、例えば i386 用のexeだと以下のように出る。Windowsはもともと32bitのexeも64bit上で問題なく実行できるので、実はいろんなアーキテクチャのものが混在していて複雑なのだと思い知らされる。

$ exe-arch-detector.exe projectGenerator.exe
# Machine: 0x014c
# IMAGE_FILE_MACHINE_I386
# Intel 386

なお先ほど判定に失敗していた lovr をこれでやり直すと以下のようにちゃんと判定できる。

$ exe-arch-detector.exe C:\Users\fu\apps\lovr\lovr.exe
# Machine: 0x8664
# IMAGE_FILE_MACHINE_AMD64
# x64

このエントリーをはてなブックマークに追加follow us in feedly