main()に来る前に呼ばれる関数の確認 (2/3)

dl-machine.h (glibc/sysdep/aarch64/dl-machne.h)
_dl_start()
 _dl_start_final()
  _dl_sysdep_start(arg, &dl_main);
    dl_mainはセクションの解釈とかっぽい
_dl_start_user
 _dl_init()
   dl_initfirst ... って何?(呼ばれてないっぽい)
   preinit_arrayを呼ぶ <--- ライブラリ側のpreinit_array、.preinit_arrayセクションリンカスクリプ
   call_init()
      mapごとのDT_INIT, DT_INIT_ARRAYを呼んでる?
※ libgcc_s.so の DT_INIT から libc の call_initに来ている?
      下記はlibcのmap
        _init()
         __init_misc()
            extern char * __progname;
            extern char * __progname_full;
         __ctype_init()
           upperとかlowerとかdigitとかalphaとかを定義しているみたい
      libgcc_s.soは DT_INIT_ARRAYもある
        frame_dummy()
      libm
        もframe_dummy()?
      libstdc++
        もframe_dummy()?
        PREINIT_FUNCTION_WEAK() って何? のフックがある
      libmylib
        constructor(0)に登録した関数はここから呼ばれるみたい
        global変数クラスのコンストラクタ(init_priority(1)もここから
           __cxa_atexit()でデストラクタを登録するみたい
        register_tm_clones()
_dl_start_userから突き抜けて↓実行する
_dl_start()の返り値が本体側(ライブラリじゃない側)のエントリポイントとなる
それがユーザ側の _start(0x400850) となる
_start()
 __libc_start_main  (libcの関数)
  rtld_fini(==_dl_fini)を__cxa_atexitで登録
    ==mapごとのfini_array関数を呼ぶためのもの
  init()
   __libc_csu_init
     __preinit_array
     _init  PREINIT_FUNCTION_WEAK() って何? のフックがある
     __init_array <-- 本体側にかいたのはここから呼ばれる
 first_callならmainを呼ぶ
 そうじゃないならpthreadに違いない
 exit, __GI_exit, __run_exit_handlers
  __call_tls_dtors()    thread_atexitを呼ぶための関数・・・みたい
  __exit_funcsに登録された関数を順に呼ぶ (atexitとか、グローバルコンストラクタから登録された関数や)
   - ~MyClass
   - _dl_fini
      _dl_sort_fini
     結局、DT_FINI_ARRAY を呼ぶ  <--- ここで mydeinit関数が呼ばれる
     mainプログラムの場合
       __do_global_dtors_aux() <--- .ctor, .dtorセクションを使ってたらここでハンドルされるっぽい
        deregister_tm_clones()
       DT_FINI を呼ぶ、/* Next try the old-style destructor.  */ らしい
         何もしない _fini が呼ばれる
     libhogehogeの場合
       __do_global_dtors_aux() <--- はすべてのライブラリで呼ばれる
     libmの場合
       __do_global_dtors_aux() <--- はすべてのライブラリで呼ばれる
       __cxa_finalize <<

__libc_csu_fini <-- 実質使われていない
_fini() <-- 実質使われていない

このブログ記事について

このページは、らるるが2016年10月11日 23:31に書いたブログ記事です。

ひとつ前のブログ記事は「main()に来る前に呼ばれる関数の確認 (1/3)」です。

次のブログ記事は「main()に来る前に呼ばれる関数の確認 (3/3)」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

ウェブページ

Powered by Movable Type 7.9.0