在 x86(32 位)平台上,当运行使用 gcc-4.8.1 编译的代码时,出现了一个神秘的总线错误-march=pentium4
。我将问题追溯到 SSE 指令:
movdqa %xmm5,0x50(%esp)
esp = 0xbfffedac。movdqa
要求地址是 16 字节对齐的,但这里不是这种情况,因此会出现总线错误。
如果使用编译则不会出现该问题-march=native
(这是 Core-i3 处理器)。
据我所知,Linux/x86 上唯一保证的堆栈对齐是 4 字节。因此,代码生成器应该选择使用似乎很奇怪movdqa
,即使有指令,也没有某种对齐检查movdqu
对于可能未对齐的访问。
所以,这看起来 gcc 中有一个错误。
我不是 SSE 和 x86 ABI 方面的专家,在发送错误报告之前,我希望得到反馈。
现在 gcc 中的默认值是-mpreferred-stack-boundary=4
(16 字节对齐),设置-mincoming-stack-boundary=4
.
因此,如果从具有不同堆栈对齐假设的其他编译器(例如 OCaml)生成的代码调用使用 SSE 的 gcc 代码,则可能会出现问题(请参阅讨论在 OCaml 错误跟踪器上)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)