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

          // 注:链接器将用户指定的 constructor 属性的函数地址放在 .ctors 段中的一个构造函数数组中。

    2)依次调用 init_array 段中的 __init_array_start() ... __init_array_end()

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值