x86上的堆栈对齐 [英] Stack alignment on x86

查看:109
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆