以下是有关我的系统的一些信息:
我注意到 rsp 寄存器在叶函数中并没有像在非叶函数中那样递减。
例如,考虑文件 test.c 中的这个 C 程序:
int fx(){
int x = 30;
int y = 34;
int z = 45;
return 30;
}
int main(){
int a = 10;
int b = 20;
int c = fx();
}
用“gcc test.c -fno-stack-protector -o test”编译它后,我运行“objdump -dw -M suffix test”,我得到:
0000000000001129 <fx>:
1129: f3 0f 1e fa endbr64
112d: 55 pushq %rbp
112e: 48 89 e5 movq %rsp,%rbp
1131: c7 45 fc 1e 00 00 00 movl $0x1e,-0x4(%rbp)
1138: c7 45 f8 22 00 00 00 movl $0x22,-0x8(%rbp)
113f: c7 45 f4 2d 00 00 00 movl $0x2d,-0xc(%rbp)
1146: b8 1e 00 00 00 movl $0x1e,%eax
114b: 5d popq %rbp
114c: c3 retq
000000000000114d <main>:
114d: f3 0f 1e fa endbr64
1151: 55 pushq %rbp
1152: 48 89 e5 movq %rsp,%rbp
1155: 48 83 ec 10 subq $0x10,%rsp
1159: c7 45 fc 0a 00 00 00 movl $0xa,-0x4(%rbp)
1160: c7 45 f8 14 00 00 00 movl $0x14,-0x8(%rbp)
1167: b8 00 00 00 00 movl $0x0,%eax
116c: e8 b8 ff ff ff callq 1129 <fx>
1171: 89 45 f4 movl %eax,-0xc(%rbp)
1174: b8 00 00 00 00 movl $0x0,%eax
1179: c9 leaveq
117a: c3 retq
如您所见,在 main 中我们有
subq $0x10,%rsp
但在 fx
中这不会发生。
我的问题:
这与gcc遵循的System V ABI有关还是只是编译器执行的优化?
造成这种行为的原因是什么?
有没有办法告诉编译器我不希望在叶函数中出现这种行为?
由于您不通过寄存器传递任何参数,并且不调用任何其他函数,因此保留堆栈空间是没有意义的。
void nn(int x);
int fx(void){
volatile int x = 30;
nn(x);
return 30;
}