wiki主页:https://sourceware.org/glibc/wiki/DynamicLoader
以下是动态加载器启动的注释和汇总视图:
RTLD_START (sysdep/<arch>/dl-machine.h)
_dl_start (elf/rtld.c)
ELF_MACHINE_BEFORE_RTLD_RELOC (sysdep/<arch>/dl-machine.h)
ELF_DYNAMIC_RELOCATE (sysdep/<arch>/dl-machine.h, 重新定位加载器)
_dl_start_final(elf/rtld.c,_dl_start 的下半部分)
entry = _dl_sysdep_start (sysdep/generic/dl-sysdep.c)
user_entry = (ElfW(Addr)) ENTRY_POINT;
dl_main(elf/rtld.c,加载器的主要入口点)
_dl_init_paths(elf/dl-load.c,填写RPATH和LD_LIBRARY_PATH信息)
_dl_debug_initialize (elf/dl-debug.c, _r_debug 和 DT_DEBUG 的初始化)
DL_SYSDEP_INIT;
DL_PLATFORM_INIT; (sysdeps/<arch>/dl-machine.h)
/* _dl_sysdep_start 的最后一个动作返回用户入口点 */
return user_entry;
/* _dl_start 的最后一个动作返回用户入口点 */
ELF_MACHINE_START_ADDRESS (GL(dl_loaded), entry); (sysdep/<arch>/dl-machine.h)
_dl_init(elf/dl-init.c,运行 DSO 初始化程序)
call_init (elf/dl-init.c)
跳转到 _dl_start 的返回 (sysdep/<arch>/dl-machine.h)
/*用户代码现在执行*/