- elf格式的可执行文件会查找elf头的e_entry条目,这个条目中保存了程序入口函数的地址,也就是_start函数的地址。
_start函数会把参数准备好,然后调用__libc_start_main函数,这个函数的原型如下:
int __libc_start_main(int (*main) (int, char * *, char * *), /* address of main function */
int argc, /* number of command line args */
char * * ubp_av, /* command line arg array */
void (*init) (void), /* address of init function */
void (*fini) (void), /* address of fini function */
void (*rtld_fini) (void), /* address of dynamic linker fini function */
void (* stack_end) /* end of the stack address */
);
__libc_start_main函数会启动程序线程用来执行main函数。在这之前会先调用_init函数进行一些环境初始化,_init函数可以自定义,具体查看gcc手册。_fini和rtld_fini函数注册在函数退出时执行。