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() <-- 実質使われていない
