繁体   English   中英

无法设置堆栈边界gcc

[英]Can't set stack boundary gcc

我的C代码:

#include <stdio.h>

foo()
{
  char buffer[8];
}

main()
{
  foo();
  return 0;
}

我使用gcc -ggdb -mpreferred-stack-boundary=2 -o bar bar.c

当我使用GDB ./bar加载它时,我看到foo函数内部的代码是:

sub $0x0c,$esp

为什么会这样呢?

我想缓冲堆栈中的8个字节,因此它应该是sub $0x8,$esp

为什么不能将堆栈边界设置为4个字节?

救命!

我无法完全重现您所看到的内容,但是在我的4.8.2版本的gcc上,该选项确实会影响此代码使用的堆栈量(请确保使用“缓冲区”,以避免对其进行优化,然后修复没有返回类型/参数类型的警告):

#include <stdio.h>

void foo(void)
{
    char buffer[8];
    buffer[0] = 'a';
    buffer[1] = '\n';
    buffer[2] = 0;
    printf("my first program! %s\n", buffer);
}

int main()
{
    foo();
    return 0;
}

使用-mpreferred-stack-boundary = 2和-mpreferred-stack-boundary = 4进行编译,生成的汇编器之间的区别非常明显:

$ diff -u stb-2.s stb-4.s 
--- stb-2.s 2014-04-10 09:00:39.546038191 +0100
+++ stb-4.s 2014-04-10 09:00:58.895108979 +0100
@@ -15,11 +15,11 @@
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
-   subl    $16, %esp
-   movb    $97, -8(%ebp)
-   movb    $10, -7(%ebp)
-   movb    $0, -6(%ebp)
-   leal    -8(%ebp), %eax
+   subl    $40, %esp
+   movb    $97, -16(%ebp)
+   movb    $10, -15(%ebp)
+   movb    $0, -14(%ebp)
+   leal    -16(%ebp), %eax
    movl    %eax, 4(%esp)
    movl    $.LC0, (%esp)
 .LEHB0:
@@ -67,9 +67,10 @@
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
+   andl    $-16, %esp
    call    _Z3foov
    movl    $0, %eax
-   popl    %ebp
+   leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret

因此,至少在gcc 4.8.2中。 对于x86-32,该选项有效。

当然,根据文档,默认值为-mpreferred-stack-boundary = 2,所以这也许就是为什么您看不到与“ without”没有任何区别的原因(尽管在我的实验中,它似乎是-mpreferred-stack-boundary = 4)。 [瞬间过去]啊,默认值已经随着时间而改变,所以在线4.4.2文档说2,我的4.8.2的信息gcc说4,这解释了差异。

至于为什么代码要分配十二个字节的堆栈空间,请看一下printf的调用方式:

movl    $.LC0, (%esp)
call    printf

如果编译器可以,它将在函数开始时为函数调用预分配参数空间,而不是像在这种情况下那样使用push $.LC0 差别不大,但是它在printf的另一侧保存了至少一条指令用于清理(并且这使得在生成的代码中更容易处理相对于堆栈的偏移量,因为编译器不必跟踪当前堆栈指针所在的位置-它始终在函数开始处的序言代码之后,一直到函数结束处的恒定位置。 由于最终还是需要空间,因此“节省4个字节”毫无意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM