オブジェクトファイルからオブジェクトコード(機械語)を表示するためには dumpbin コマンドを使います。
dumpbin コマンドを使うと、オブジェクトファイルに格納されているオブジェクトコード(機械語)を出力することができるようになります。具体的には x86 アセンブラのニーモニックとオペランドが出力されます。
たとえば次のようなソースコードがあったとき…
#include <cstdio> int someFunction(int value) { return value + 10; } int main(int argc, char* argv[]) { std::printf("Results is [%d]\n", someFunction(123)); return 0; }
以下のように実行すると…
cl /c source.cpp dumpbin /disasm source.obj
結果は以下のようになります。
Dump of file source.obj
File Type: COFF OBJECT
?someFunction@@YAHH@Z (int __cdecl someFunction(int)):
00000000: 55 push ebp
00000001: 8B EC mov ebp,esp
00000003: 8B 45 08 mov eax,dword ptr [ebp+8]
00000006: 83 C0 0A add eax,0Ah
00000009: 5D pop ebp
0000000A: C3 ret
0000000B: CC int 3
0000000C: CC int 3
0000000D: CC int 3
0000000E: CC int 3
0000000F: CC int 3
_main:
00000010: 55 push ebp
00000011: 8B EC mov ebp,esp
00000013: 6A 7B push 7Bh
00000015: E8 00 00 00 00 call ?someFunction@@YAHH@Z
0000001A: 83 C4 04 add esp,4
0000001D: 50 push eax
0000001E: 68 00 00 00 00 push offset $SG3907
00000023: E8 00 00 00 00 call _printf
00000028: 83 C4 08 add esp,8
0000002B: 33 C0 xor eax,eax
0000002D: 5D pop ebp
0000002E: C3 ret
Summary
84 .debug$S
45 .drectve
11 .rdata
2F .textsomeFunction() という関数がネームマングリングによって ?someFunction@@YAHH@Z になっていたり、関数の後ろにパディングがあったりしていることが見て取れます。 printf() 関数のフォーマット部は $SG3907 に定数として配置されているようです。
最適化によって自分が作ったコードがどう変化するのか知りたいときなどには思い出してみてください。
Contributions