ELF 文件头的 e_entry 项指明了入口地址,可以通过 objdump -f 命令查看 ELF 文件头信息,一般来说,入口地址的就是代码段 _start 符号的起始地址,在 _start 中调用了 libc 中的 __libc_start_main(),该函数的大致流程是:
1)判断是否是静态链接库,如果是,则调用 _dl_start_user() ,否则调用 __libc_init_first();
2)调用 __libc_csu_init();
3)调用 main();
4)调用 __GI_exit → __run_exit_handlers()。
其中 __libc_csu_init() 比较复杂,需要展开来看,它的大致流程是:
1)调用 _init(),该函数又依次调用了以下函数:
__gmon_start__()
frame_dummy()
__do_global_ctors_aux() (依次调用 ctors 段中的 __CTOR_LIST__() ... __CTOR_END__() )
2)依次调用 init_array 段中的 __init_array_start() ... __init_array_end()