.init:080482A1 add ebx, 1D54h .init:080482A7 mov edx, ds:( gmon_start _ptr - 8049FF4h)[ebx] .init:080482AD test edx, edx .init:080482AF jz short loc_80482B6
.init:080482B1 call
.init:080482B6 _gmon_start
.init:080482B6 loc_80482B6: ; CODE XREF:
_init_proc+1B j .init:080482B6 call frame_dummy
.init:080482BB call
init:080482C0 pop eaxdo_global_ctors_aux .init:080482C1 pop ebx .init:080482C2 leave .init:080482C3 retn .init:080482C3 _init_proc endp 我们看到它又调用了. gmon_start、frame_dummy、 do_global_ctors_aux.这三个 函数的作用中,一个是 gpronf 检查函数会用的到,我们编译的时候加-pg 即可设置,然后 运行会自动生成 gmou.a 文件,对函数的调用次数时间等进行记录。Frame 主要是最后调用 call register_frame_info_base,传入 elf 中.eh_frame 和.bss,对它们进行注册。最 后我们了解下 do_global_ctors_aux,它的作用是分发构造函数。这部分大家可以通过阅 读 glibc 源代码 cus 下进行深入理解。 我们知道 elf结构中有.init和.finit两个节,和 libc_cus_init、 libc_cus_finit 基本是对应的,存放主函数前后执行初始化等。 然后 main 函数我们就不讲了,具体里面 printf 是如何执行等,这些都属于基本的,用 户调用 glibc,系统调用等等。 我 们整理下 我们大 概整理的函 数执行流 程,从 _start 到 libc_start_main, libc_start_main 调用__libc_csu_init、main、__libc_csu_finit, libc_csu_init 调 用 gmon_start、frame_dummy、 do_global_ctors_aux.大概就是这样一个流程。 |