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:
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.
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).