dumpbin.exe は link.exe の単なるラッパーだった
モジュールの調査でよく使う dumpbin ツールが、リンカーの単なるラッパーだったという話です。
動作確認環境
- Windows 11 Home 21H2
- Visual Studio Community 2019
便利な dumpbin
EXE や DLL の調査に便利な dumpbin ツール。
特に次のオプションはよく使います。
- /headers : ヘッダー情報を表示
- /dependents : 依存 DLL を表示
- /exports : エクスポート情報を表示
- /imports : インポート情報を表示
自作の DLL 「MyDll.dll」のエクスポート情報を見てみます。
C:\tmp>dumpbin /exports MyDll.dll
Microsoft (R) COFF/PE Dumper Version 14.28.29913.0
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file MyDll.dll
......
ordinal hint RVA name
1 0 00001000 MyFunc1
2 1 00001020 MyFunc2
3 2 00018000 MyVar1
4 3 00018004 MyVar2
......
関数 MyFunc1, MyFunc2 と変数 MyVar1, MyVar2 がエクスポートされていることが確認できます。
link.exe を呼び出している
「dumpbin.exe」の動作を調べていたところ、「link.exe」を呼び出していることに気が付きました。
「dumpbin /imports MyDll.dll」でインポート情報を表示中にコマンドプロンプトをマウスで選択して処理を一時中断し、
タスクマネージャーから「コマンドライン」(要設定)を見ると、並行して「LINK /DUMP /imports MyDll.dll」が実行されています。
「dumpbin /headers MyDll.dll」でヘッダー情報を表示中にコマンドプロンプトをマウスで選択して処理を一時中断し、
タスクマネージャーから「コマンドライン」を見ると、並行して「LINK /DUMP /headers MyDll.dll」が実行されています。
「link.exe」ファイルを削除すると、dumpbin ツールは「2 = ERROR_FILE_NOT_FOUND」で失敗します。
C:\tmp>dumpbin /headers MyDll.dll
DUMPBIN : error : cannot execute LINK.EXE; errno = 2 (2)
「dumpbin.exe」のファイルサイズは 20KB しかなく、「link.exe」は約 2MB あります。
C:\tmp>where /t dumpbin.exe
20368 2021/04/02 21:11:02 C:\Program Files (x86)\...\dumpbin.exe
C:\tmp>where /t link.exe
1882040 2021/04/02 21:11:02 C:\Program Files (x86)\...\link.exe
それでも一部のファイル解析など行っているのではないかと思ったのですが、「dumpbin /?」によるヘルプ表示でさえ、「LINK /DUMP /?」に丸投げでした。
要するに、「dumpbin <引数>」=「link /dump <引数>」です。
lib や editbin も
いろいろ試していたところ、「link /help」で次の情報が表示されました。
C:\tmp>link /help
Microsoft (R) Incremental Linker Version 14.28.29913.0
Copyright (C) Microsoft Corporation. All rights reserved.
Linker のヘルプについては `link /link' や `link' と入力してください
Library Manager のヘルプについては `link /lib' や `lib' と入力してください
Dumper のヘルプについては `link /dump' や `dumpbin' と入力してください
Editor のヘルプについては `link /edit' や `editbin' と入力してください
CvtCIL のヘルプについては `link /cvtcil' と入力してください
PushThunkObj Generator のヘルプについては `link /pushthunkobj' と入力してください
なんと、dumpbin に限らず、lib も editbin も「link.exe」への丸投げコマンドでした。