在x86上堆栈对齐

Dav*_*aux 10 linux x86 gcc sse

当运行使用gcc-4.8.1编译的代码时,我在x86(32位)平台上发生了一个神秘的总线错误-march=pentium4.我将问题追溯到SSE指令:

movdqa %xmm5,0x50(%esp)
Run Code Online (Sandbox Code Playgroud)

esp = 0xbfffedac.movdqa要求地址为16字节对齐,这不是这种情况,因此总线错误.

如果使用-march=native(这是Core-i3处理器)进行编译,则不会出现此问题.

据我所知,Linux/x86上唯一保证的堆栈对齐是4字节.因此,movdqa即使存在movdqu可能未对齐访问的指令,代码生成器应该选择使用而不进行某种对齐检查似乎很奇怪.

所以,这看起来像gcc中有一个bug.

我不是SSE和x86 ABI的专家,在发送错误报告之前我会很感激.

Dav*_*aux 7

现在gcc中的默认值是-mpreferred-stack-boundary=4(16字节对齐),它设置-mincoming-stack-boundary=4.

如果使用SSE的gcc代码是由具有不同堆栈对齐假设的其他编译器生成的代码调用的,则会出现问题,例如OCaml(请参阅有关OCaml错误跟踪器的讨论).