Help us understand the problem. What is going on with this article?

Delphi がインストールされた環境で、EXE / DLL が 32bit / 64bit いずれなのかを判別する

はじめに

たまに EXE / DLL が 32bit / 64bit いずれのものなのか調べたい時がありますよね。

やり方

dumpbin.exe? Delphi (や C++Builder) をインストールした環境なら、<インストールフォルダ>\binTDUMP.EXE があるので、これを使います。

See also:

テスト用の DLL を作る

EXE の 32bit / 64bit は実行してみればタスクマネージャで判るので、今回は DLL でテストします。まずはテスト用の中身のない DLL を作ります。

  1. [新規作成 | その他] で ダイナミックリンクライブラリ を選択。
    image.png
  2. [ファイル | プロジェクトに名前を付けて保存] で適当な場所に TestDLL.dproj として保存。
  3. プロジェクトマネージャの ターゲットプラットフォーム を右クリックして [プラットフォームの追加]。
    image.png
  4. Windows 64ビット を選択して [OK]。
    image.png
  5. [ビルドグループペインの表示] ボタンを押してビルドグループペインを表示
    image.png
    6.[ビルドグループを新規作成] ボタンを押す。
    image.png
    7.名前を ALL にする。
    image.png
    8.[構成] を Release にし、[プラットフォーム] を Win32;Win64 とする。
    image.png
    9.[現在のビルドグループをビルド] を押す。
    image.png
    これで 32bit と 64bit の DLL が一気に生成されます。 image.png

で、判別方法

tdump -e ファイル名

とやると、次のような結果が得られます。

Old Executable Header

DOS File Size                                     110E00h  (1117696. )
Load Image Size                                      210h  (   528. )
Relocation Table entry count                          0000h  (     0. )
Relocation Table address                              0040h  (    64. )
Size of header record      (in paragraphs)            0004h  (     4. )
Minimum Memory Requirement (in paragraphs)            000Fh  (    15. )
Maximum Memory Requirement (in paragraphs)            FFFFh  ( 65535. )
File load checksum                                    0000h  (     0. )
Overlay Number                                        001Ah  (    26. )

Initial Stack Segment  (SS:SP)                    0000:00B8
Program Entry Point    (CS:IP)                    0000:0000


Portable Executable (PE) File

Header base: 00000100

CPU type                 80386
Flags                    A18E [ executable 32bit library ]
DLL flags                0000 [ ]
Linker Version           2.19
Time stamp               5F6F442B : Sat Sep 26 22:37:47 2020
O/S Version              5.0
User Version             0.0
Subsystem Version        5.0
Subsystem                0002 [ Windows GUI ]
Object count             0000000A
Symbols offset           00000000
Symbols count            00000000
Optional header size     00E0
Magic #                  10B
Code size                000F2C00
Init Data size           0001DE00
Uninit Data size         00000000
Entry RVA                000F48E4
Image base               00400000
Code base                00001000
Data base                000F5000
Object/File align        00001000/00000200
Reserved                 00000000
Image size               0011E000
Header size              00000400
Checksum                 00000000
Stack reserve/commit     00000000/00000000
Heap reserve/commit      00100000/00001000
Number interesting RVAs  00000010

  ...

CPU type 行が 80386 なら 32bit、AMD64 なら 64bit DLL です 1

<インストールフォルダ>\bin には GREP.EXE もあるので、

tdump -e ファイル名 | grep "CPU type"

とやると、CPU type 行だけを抽出できます。
image.png
EXE / DLL の 32bit / 64bit を調べるだけなら TDUMP64.EXE を使っても結果は同じです。

See also:

おわりに

誰ですか?「メモ帳に食わせれば...」とか言うのは!
image.png
image.png

名前
IMAGE_FILE_MACHINE_I386 0x014C
IMAGE_FILE_MACHINE_AMD64 0x8664

See also:


  1. 16bit EXE / DLL だと何も表示されません ("CPU type" 行がありません)。 

ht_deko
とある熊本の障害復旧(トラブルシューター)
https://ht-deko.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away