4

非常に単純なソースファイル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、比較などが指すメモリ位置に追加されるのはなぜですか?プログラムが正しく実行されたことを確認することだけですか?

4

2 に答える 2

11

コードではないビットを分解したと思います。そのため、あまり意味がありません。

ファイルに何が含まれているのかを知るためobjdumpに、フルバイナリ(ELF)で実行して、いずれかのセクションで上記のバイトシーケンスを認識できるかどうかを確認することをお勧めします。

于 2012-05-30T12:34:45.823 に答える
2

このセクションは.eh_frame、の直後にあり.textます。-fno-asynchronous-unwind-tablesgccでコンパイルするときに使用することでそれを取り除くことができます。

GCCでコンパイルされたCプログラムに.eh_frameセクションが必要な理由を参照してください。詳細については。

于 2019-04-19T04:23:32.420 に答える