x86上的堆栈对齐 [英] Stack alignment on x86
问题描述
在x86(32位)平台上运行带有 -march = pentium4
的gcc-4.8.1编译的代码时,在x86(32位)平台上发生了一个神秘的总线错误.我将问题追溯到SSE指令:
movdqa%xmm5,0x50(%esp)
,其中esp = 0xbfffedac. movdqa
要求地址是16字节对齐的,此处不是这种情况,因此是总线错误.
如果使用 -march = native
(这是Core-i3处理器)进行编译,则不会发生此问题.
据我所知,Linux/x86上唯一保证的堆栈对齐是4字节.因此,即使有一条指令 movdqu
可能未对齐的访问,代码生成器应该选择使用 movdqa
而不进行某种对齐检查似乎很奇怪.>
所以,这似乎是gcc中有一个错误.
我不是SSE和x86 ABI方面的专家,在发送错误报告之前,我希望能得到反馈.
现在,gcc中的默认值为 -mpreferred-stack-boundary = 4
(16字节对齐),它设置了-mincoming-stack-boundary = 4
.
因此,如果从其他具有不同堆栈对齐假设的编译器(例如OCaml)生成的代码中调用使用SSE的gcc代码,则会出现问题(请参阅 解决方案
Now the default in gcc is -mpreferred-stack-boundary=4
(16-byte alignment), which sets -mincoming-stack-boundary=4
.
Problems can thus occur if gcc code using SSE is called from code generated by other compilers which have different stack alignment assumptions, such as OCaml (see discussion on the OCaml bug tracker).
这篇关于x86上的堆栈对齐的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!