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 <<?? __exit_funcs __quick_exit_funcs at_quick_exit()で登録した関数を呼ぶ、正常終了時は呼ばない、quick_exitのときはよぶ __unregister_atfork() pthread_atforkで登録した関数を・・・? __libc_atexit _IO_cleanup ...だけっぽい? _exit
__libc_csu_fini <-- 実質使われていない
_fini() <-- 実質使われていない