Warum gibt der GCC-Disassembler zusätzlichen Speicherplatz für lokale Variablen frei?

8

Ich habe eine einfache Funktion in C geschrieben,

%Vor%

Wenn ich es im Disassembler von gdb zerlege, gibt es folgende Demontage.

%Vor%

Sehen Sie sich jetzt Zeile drei an, 0x08048467 <+3>: sub xor %gs:0x14,%eaxx10,%esp , ich habe nur 8 Bytes als lokale Variable zugewiesen, dann wies der Compiler 16 Bytes (0x10) zu.

Zweitens, was bedeutet %code% .

@Edit: Wenn es Optimierung ist, gibt es eine Möglichkeit, es zu stoppen.

Danke.

    
Pranit Kothari 01.01.2014, 03:15
quelle

3 Antworten

12

Zwei Dinge:

  1. Der Compiler kann Platz für Zwischenausdrücke reservieren, denen Sie im Quellcode keine Namen gegeben haben (oder umgekehrt keinen Platz für lokale Variablen vergeben, die vollständig in Registern leben können). Die Liste der Stack-Slots in der Binärdatei muss nicht mit der Liste der lokalen Variablen im Quellcode übereinstimmen.
  2. Auf einigen Plattformen muss der Compiler den Stapelzeiger ausgerichtet halten. Für das spezielle Beispiel in Ihrer Frage ist es wahrscheinlich, dass der Compiler bestrebt ist, den Stapelzeiger auf eine Grenze von 16 Bytes ausgerichtet zu halten.

In Bezug auf Ihre andere Frage, die Sie getrennt hätten stellen sollen, ist xor %gs:0x14,%eax eindeutig Teil eines Stack-Schutz-Mechanismus , Standardmäßig aktiviert. Wenn Sie GCC verwenden, deaktivieren Sie es mit -fno-stack-protector .

    
Pascal Cuoq 01.01.2014, 03:20
quelle
5

Neben den anderen bereits gegebenen Antworten wird gcc es vorziehen, den Stapel 16-Byte-ausgerichtet zu halten, um SSE-Werte auf dem Stapel zu speichern, da einige (alle?) der SSE-Befehle erfordern, dass ihr Speicherargument 16-Byte-ausgerichtet ist / p>     

Geoff Reedy 01.01.2014 05:38
quelle
4

Dies baut auf Pascals Antwort auf, aber in diesem Fall liegt das wahrscheinlich am Stack-Schutz-Mechanismus.

Sie ordnen 8 Bytes zu, das ist ausreichend und wird mit dem Stack-Pointer berücksichtigt. Außerdem wird die aktuelle Stapelschutzadresse in %ebp gespeichert, die in den folgenden Zeilen auf top des aktuellen Stapelrahmens zeigt

%Vor%

Dies scheint vier Bytes zu dauern. In Anbetracht dessen sind die anderen vier Bytes wahrscheinlich für die Ausrichtung irgendeiner Form oder werden mit anderen Stapelinformationen in den folgenden Zeilen aufgenommen:

%Vor%     
slugonamission 01.01.2014 03:56
quelle