簡體   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