Zrozumienie nowego prologu gcc
Zastanawiałem się, dlaczego gcc wprowadził nowy prolog (i epilog) również do funkcji - zwłaszcza main (), ponieważ tylko go analizowałem. Na przykład wcześniej było to:
push ebp
mov ebp, esp
sub esp, 0x... ; Allocate memory space into the stack
; ... Some code
; Epilogue
leave
ret
Teraz jest to trochę bardziej skomplikowane (przynajmniej zrozumieć):
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
Rozumiem, co konkretnie robi, ale nie mogę zrozumiećcel, powód tego. Czy ma to na celu sprawienie, by próby wykorzystania (przepełnienie stosu) były nieco trudniejsze? Inna konwencja dzwonienia? Aby uczynić stos bezpieczniejszym? (Odkąd poznałem te rzeczy w grze wojennej)
Wreszcie moja wersja gcc to: gcc wersja 4.3.2 (Debian 4.3.2-1.1)
Z góry dziękuję!