非常に単純なソースファイルtest.cをコンパイルした結果のコードを分解しました。これは、次のようになります。
void main() {}
これらのコマンドを実行して、関数を静的実行可能ファイルにリンクしmain
(編集者注:CRT開始コードがないため、クラッシュするだけです)、いくつかのセクションが削除されたフラットバイナリに抽出して、ndisasm
(編集者注: ELFメタデータを理解しobjdump -drwC -Mintel
ない)
gcc -c test.c
ld -o test -Ttext 0x0 -e main test.o
objcopy -R .note -R .comment -S -O binary test test.bin
ndisasm -b 32 test.bin
そして、これは私が得たものです:
00000000 55 push ebp
00000001 89E5 mov ebp,esp
00000003 5D pop ebp
00000004 C3 ret
00000005 0000 add [eax],al
00000007 001400 add [eax+eax],dl
0000000A 0000 add [eax],al
0000000C 0000 add [eax],al
0000000E 0000 add [eax],al
00000010 017A52 add [edx+0x52],edi
00000013 0001 add [ecx],al
00000015 7C08 jl 0x1f
00000017 011B add [ebx],ebx
00000019 0C04 or al,0x4
0000001B 0488 add al,0x88
0000001D 0100 add [eax],eax
0000001F 001C00 add [eax+eax],bl
00000022 0000 add [eax],al
00000024 1C00 sbb al,0x0
00000026 0000 add [eax],al
00000028 D8FF fdivr st7
0000002A FF db 0xff
0000002B FF05 00000000 inc dword [dword 0x0]
00000031 41 inc ecx
00000032 0E push cs
00000033 088502420D05 or [ebp+0x50d4202],al
00000039 41 inc ecx
0000003A 0C04 or al,0x4
0000003C 04C5 add al,0xc5
0000003E 0000 add [eax],al
最初の4行を超えるすべての目的は何ですか?eax、2 * eax、edx + 0x52、比較などが指すメモリ位置に追加されるのはなぜですか?プログラムが正しく実行されたことを確認することだけですか?