为什么帧指针保存在main函数的开头

Why are frame pointers saved in the beginning of the main function

假设这个 C 代码:

int main(){
   return 0;
}

在汇编中看起来像这样:

main:
    pushq   %rbp
    movq    %rsp, %rbp
    movl    [=11=], %eax
    popq    %rbp
    ret

我知道 pushq %rbp 需要将帧指针 fp 保存在函数的开头,因为它需要在返回调用函数时恢复。

我的问题是为什么要在 main 中这样做? main 的父呼叫者是什么? fp 不是指向一个虚拟地址,这意味着当 main 终止时该地址对下一个程序不再有任何意义,对吗?

fp(甚至 sp)值是否在不同的程序及其地址 space 之间保持不变?

what's the parent caller of main?

在linux中main__libc_start_main调用在术语中被_start调用,在windows中我不是当然可以,但还有一个 _start.

事实上,一个巧妙的技巧是在没有 main:

的情况下启动 C 程序
#include <stdio.h> 
#include <stdlib.h>

void _start() 
{  
    printf("No main function!\n");
    exit(0); 
} 

编译:

gcc main.c -nostartfiles

对于 Windows(10, gcc 8.1.0) 和 Ubuntu(18.04, gcc 9.2.0)

clang -Wl,-e,-Wl,__start main.c

对于 MacOS(10.14.6,Xcode11.3)

这里有一篇文章讲的是Linux x86 Program Start Up