考虑以下程序:
int main()
{
int arr[8];
}
在Linux 20上使用gcc 9.3.0进行编译时,文件的反汇编在开始时看起来像这样(这不是上面代码的整体汇编!):
┌ 72: int dbg.main (int argc, char **argv, char **envp);
│ ; var int[8] arr @ rbp-0x30
│ ; var int64_t canary @ rbp-0x8
│ 0x00001169 f30f1efa endbr64 ; test.c:2 { ; int main();
│ 0x0000116d 55 push rbp
│ 0x0000116e 4889e5 mov rbp, rsp
│ 0x00001171 4883ec30 sub rsp, 0x30
当arr
只有8个int = 8 * 4个字节长(sub rsp, 0x30
)时,为什么汇编程序会在堆栈上分配0x30 = 48个字节?
但是主要是因为它没有优化。由于它是叶函数,因此只要本地变量适合红色区域,就不需要对齐堆栈,也不需要任何分配。另外,
format
注释中提到的内容似乎表明这是与所示程序不同的程序集。@Jester:就此而言,
arr
可以完全优化;通过优化,您就可以得到xor eax, eax ; ret
。我发现这是format
神秘的,因为它似乎重叠了arr
。