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

 

上一篇:攻防世界(3):guessnum


下一篇:BIT 常态化在线CTF系统 pwn题目