gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 02:56:32 24 4
gpt4 key购买 nike

假设这个 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)值是否在不同程序及其地址空间之间持久存在?

最佳答案

what's the parent caller of main?

在 linux 中,main__libc_start_main 调用,在 term 中,由 _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,Xcode 11.3)

这是一篇讨论 Linux x86 Program Start Up 的文章

关于c - 为什么帧指针保存在main函数的开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60442590/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com