2013-10-21 4 views
6

Ich habe eine Funktion:Warum reserviert mein Compiler mehr Platz als für einen Funktionsstapelrahmen erforderlich?

void func(int a) 
{ 
    int x = a+2; 
} 

In dem Assembler-Code, in Funktion prolog:

push %ebp 
mov %esp, %ebp 
sub $0x10, %esp 

Der Code muss nur Platz für x d.h. 4 Bytes reserviert. Aber es reserviert 16 Bytes. Warum das ? Ich habe es immer gesehen, um mehr Platz als erforderlich zu reservieren.

Meine Vermutung: Es neigt dazu, in 16 Bytes zu speichern. Wenn ich beispielsweise 20 Bytes benötige, reserviert es 32 Bytes, egal was passiert.

+0

Es scheint, dass meine Vermutung falsch ist, weil in diesem Link der Typ nur 16 Byte Speicherplatz benötigt, aber 32 Bytes reserviert sind. http://stackoverflow.com/questions/13430540/please-i-dont-understand-why-sub-0x20-esp-let-me-know – Rash

+0

Mögliche Duplikat von http://stackoverflow.com/questions/4175281/what -does-it-to-align-the-stack. –

+0

Hallo @PaulGriffiths Dies ist kein Duplikat, da diese Frage erklärt, warum Sie den Speicher ausrichten müssen. Ich frage, warum mehr als der benötigte Speicherplatz im Stack reserviert ist? – Rash

Antwort

5

Das hängt stark von Ihrer Architektur und Compiler-Flags ab, so dass es unmöglich ist, auf eine einzige Sache hinzuweisen und "das muss es sein" hier zu sagen. Jedoch kann ich Ihnen einige Hinweise geben, die Sie hilfreich finden können.

Betrachten Sie zuerst die Stapelgrenze. Möglicherweise haben Sie von der Markierung -mprefered-stack-boundary = X zu GCC gehört. Wenn nicht, teilt es Ihrem Compiler im Wesentlichen mit, dass Ihre Werte auf dem Stack jeweils 2^X Bytes sind. Ihr Compiler wird dann versuchen, Ihr Programm so zu optimieren, dass diese Werte so gut wie möglich auf den Stack passen. Auf der anderen Seite wird GCC-Modifikator wie __packed__ den Compiler versuchen, die Daten im Stapel so eng wie möglich anzupassen.

Es gibt auch den Stapelschutz. Im Grunde legt GCC Dummy-Werte auf den Stack, die sicherstellen, dass Pufferüberläufe keinen Schaden verursachen können, außer dem Segfauling Ihres Programms (was nicht spaßig ist, aber besser als ein Angreifer, der die Kontrolle über den Befehlszeiger übernimmt). Sie können dies einfach ausprobieren: Nehmen Sie eine aktuelle Version von GCC und lassen Sie den Benutzer einen Puffer überlaufen. Sie werden feststellen, dass das Programm mit einer Meldung nach dem Motto "Stack-Zerschlagung erkannt, beendet" beendet wird. Versuchen Sie, Ihr Programm mit -fno-stack-protector zu kompilieren, und der zugewiesene lokale Speicher auf dem Stack wird wahrscheinlich kleiner sein.

+0

Hinweis: Diese Antwort ist die gleiche wie die erste Hälfte meiner Antwort hier gegeben: http://stackoverflow.com/questions/19736213/explain-esp-ebp-in-this-program/19736689#19736689 Ich würde nicht in Betracht ziehen es ein Duplikat, aber Sie können es trotzdem nützlich finden. – Anonymous

Verwandte Themen