Stapelausrichtung auf x86

8

Ich hatte einen mysteriösen Busfehler, der auf einer x86 (32-Bit) -Plattform bei der Ausführung von Code aufgetreten ist, der mit gcc-4.8.1 mit -march=pentium4 kompiliert wurde. Ich verfolgte das Problem auf eine SSE-Anweisung:

%Vor%

mit esp = 0xbfffedac. movdqa erfordert, dass die Adresse 16-Byte-ausgerichtet ist, was hier nicht der Fall ist, also der Busfehler.

Das Problem tritt nicht auf, wenn mit -march=native kompiliert wird (dies ist ein Core-i3-Prozessor).

Soweit ich weiß, ist die einzige auf Linux / x86 garantierte Stapelausrichtung 4 Byte. Daher erscheint es seltsam, dass der Code-Generator movdqa ohne irgendeine Art von Alignment-Check verwenden sollte, obwohl es eine Anweisung movdqu für möglicherweise nicht ausgerichtete Zugriffe gibt.

Das sieht also so aus, als gäbe es einen Fehler in gcc.

Ich bin kein Experte für SSE und x86 ABI und würde mich über Feedback freuen, bevor ich einen Fehlerbericht sende.

    
David Monniaux 13.02.2014, 07:57
quelle

1 Antwort

5

Jetzt ist der Standard in gcc -mpreferred-stack-boundary=4 (16-Byte-Ausrichtung), was -mincoming-stack-boundary=4 festlegt.

Probleme können daher auftreten, wenn GCC-Code, der SSE verwendet, aus Code aufgerufen wird, der von anderen Compilern erzeugt wird, die unterschiedliche Stack-Alignment-Annahmen haben, wie OCaml (siehe Diskussion zum OCaml Bug Tracker).

    
David Monniaux 13.02.2014 08:21
quelle

Tags und Links