linux程序启动时glibc的调用流程

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()

 

猜你喜欢

转载自blog.csdn.net/choumin/article/details/112935164