17

我想知道-mpreferred-stack-boundary在 GNU 编译器编译期间选项的用途是什么。我已经检查了文档,但我失去了解释。有人可以解释一下吗。

4

3 回答 3

17

我想知道在 GNU 调试器中编译期间 -mpreferred-stack-boundary 选项的用途。

该选项与调试器完全无关。

它会影响二进制文件中生成的代码。默认情况下,GCC 将安排事情,以便每个函数在进入时立即将其堆栈指针对齐在 16 字节边界上(如果您有局部变量并启用sse2指令,这可能很重要)。

如果将默认值更改为 eg -mpreferred-stack-boundary=2,则 GCC 将在 4 字节边界上对齐堆栈指针。这将减少您的例程的堆栈要求,但如果您的代码(或您调用的代码)确实使用sse2,则会崩溃,因此通常不安全。

于 2012-04-21T04:37:51.317 回答
1

它与程序在内存中布局时使用的字节边界有关。

堆栈边界 = 2 的作用是确保堆栈设置为 dword 大小的增量,这会阻止您的机器优化堆栈。

如果您签出:

`info gcc and search by entering "/mpreferred-stack-boundary"` it says:
>-mpreferred-stack-boundary=num
> 

尝试保持堆栈边界对齐到 2 提升到 num 字节边界。如果未指定 -mpreferred-stack-boundary,则默认值为 4(16 字节或 128 位)。

对于 Intel 386 和 AMD x86-64 机器,默认堆栈边界 4 是相同的。

当我尝试在我的 64 位 linux 机器上使用“m-preferred-stack-boundary=2”选项时,编译失败并出现错误

“-mprefered-stack-boundary=2 不在 4 到 12 之间”。

这是因为地址字段的宽度在 64 位机器中从 4 个字节增加到 8 个字节。所以它不能在 stack-boundary=2 处写入单个块,因为 2^2=4 字节。然而,有趣的是,堆栈边界为 3 在 32 位和 64 位机器上仍会返回错误,这将是 8 字节边界。

我不能包含该链接,因为我没有 10 名声望...但是搜索很容易就可以发现它是一项安全功能,因为 8 个字节很容易导致堆栈错位...毫无疑问其他人知道得更好,或者有更多的细节。

堆栈是如何错位的 说:

To ensure proper alignment of this values on the stack, the stack boundary must be as aligned as that required by any value stored on the stack. Further, every function must be generated such that it keeps the stack aligned. Thus calling a function compiled with a higher preferred stack boundary from a function compiled with a lower preferred stack boundary will most likely misalign the stack. It is recommended that libraries that use callbacks always use the default setting.

This extra alignment does consume extra stack space, and generally increases code size. Code that is sensitive to stack space usage, such as embedded systems and operating system kernels, may want to reduce the preferred alignment to -mpreferred-stack-boundary=2.

于 2017-03-27T19:22:50.207 回答
0

right, it is useful to use -mpreferred-stack-boundary with 2 to easily disassemble what's going on, otherwise it will be optimized and hard to track what's going on in the stack. for 64 bit right you need 4 at least

于 2018-04-26T10:50:52.473 回答