假设此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)值是否在不同程序及其地址空间之间保持不变?
在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的文章>