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