なぜgccが関数に新しいプロローグ(およびエピローグも)を導入したのか疑問に思っていました-特にmain()を分析しただけなので。たとえば、以前は次のとおりでした。
push ebp
mov ebp, esp
sub esp, 0x... ; Allocate memory space into the stack
; ... Some code
; Epilogue
leave
ret
これはもう少し複雑です (少なくとも理解するために):
lea ecx,[esp+0x4]
and esp,0xfffffff0
push DWORD PTR [ecx-0x4]
push ebp
mov ebp,esp
push ecx
sub esp,0x64
; Some code
; Epilogue
add esp,0x64
pop ecx
pop ebp
lea esp,[ecx-0x4]
ret
具体的に何をするのかはわかるのですが、その目的がわかりません 。エクスプロイト (スタック オーバーフロー) の試行をもう少しトリッキーにするためですか? 別の呼び出し規約?スタックをより安全にするためだけですか?(ウォーゲームで出会ったので)
最後に、私の gcc バージョンは次のとおりです: gcc バージョン 4.3.2 (Debian 4.3.2-1.1)
前もって感謝します!