为什么帧指针保存在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
假设这个 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
:
#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