Entendendo o novo prólogo do gcc
Eu estava me perguntando por que o gcc introduziu um novo prólogo (e epílogo também) para funções - especialmente main (), já que eu apenas analisei. Por exemplo, antes, era:
push ebp
mov ebp, esp
sub esp, 0x... ; Allocate memory space into the stack
; ... Some code
; Epilogue
leave
ret
Agora isso é um pouco mais complexo (para entender, pelo menos):
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
Eu entendo o que concretamente faz, mas não consigo descobrirpropósito disso. É para tornar a exploração (estouro de pilha) tenta um pouco mais complicado? Outra convenção de chamada? Apenas para tornar a pilha mais segura? (Desde que eu conheci essas coisas em um jogo de guerra)
Finalmente, minha versão do gcc é: gcc versão 4.3.2 (Debian 4.3.2-1.1)
Desde já, obrigado!