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

问题描述 投票:1回答:1

假设此C代码:

int main(){
   return 0;
}

在组装中看起来像这样:

main:
    pushq   %rbp
    movq    %rsp, %rbp
    movl    $0, %eax
    popq    %rbp
    ret

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

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

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

c assembly x86-64 stack-frame
1个回答
1
投票

在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

这里是有关Linux x86 Program Start Up的文章>

© www.soinside.com 2019 - 2024. All rights reserved.