main函数执行前,发生了什么。

  1. 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函数注册在函数退出时执行。

你可能感兴趣的:(main函数执行前,发生了什么。)