這是我的源代碼:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 500
int main(int argc, char** argv)
{
if (argc != 2)
exit(1);
char str[MAX];
strcpy(str, argv[1]);
return 0;
}
我disassembledmain使用gdb并得到以下結果:
Dump of assembler code for function main:
0x0000000000001145 < 0>: push %rbp
0x0000000000001146 < 1>: mov %rsp,%rbp
0x0000000000001149 < 4>: sub $0x210,%rsp
.
.
.
End of assembler dump.
這里值得注意的是:
0x0000000000001149 < 4>: sub $0x210,%rsp
我的問題是 -
為什么有$0x210(528 位元組),什么時候應該是$0x1f4(500 位元組),正如我所要求的那樣?
uj5u.com熱心網友回復:
我猜你正在使用 gcc 并在沒有優化的情況下進行編譯,就像這樣 (godbolt)。
這里發生了幾件事:
首先,在沒有優化的情況下編譯時,編譯器會嘗試確保每個區域變數在記憶體中都有一個地址,以便除錯器可以輕松檢查或修改它。這包括在 x86-64 上以其他方式在暫存器中傳遞的函式引數。因此,編譯器需要分配額外的堆疊空間,以便argc和argv引數可以“溢位”。您可以在程式集的第 5 行和第 6 行看到溢位:
movl
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/352218.html
