1扯躺、執(zhí)行init init_array
2、JNI onLoad
更詳細(xì)的可以參考 《Android so加載深入分析.pdf》
begin.s:__linker_init
1.dlopen函數(shù)
dlfcn.cpp
2.整體流程
linker.cpp
do_dlopen函數(shù):
find_library函數(shù):完成對so的解析裝載抡蛙、分配、鏈接
CallConstructors函數(shù):完成對so中.init和.initarray的執(zhí)行
3.先看CallConstructors函數(shù)魂迄,從后面的執(zhí)行來看
CallFunction("DT_INIT", init_func);
CallArray("DT_INIT_ARRAY", init_array, init_array_count, false);
4.回到find_library函數(shù)粗截,看so的具體加載
find_library_internal-load_library
load_library是整個(gè)so加載的主控函數(shù)
5.so加載的詳細(xì)步驟
解析裝載:
elf_reader.Load函數(shù)包括了下列函數(shù):
ReadElfHeader() &&
VerifyElfHeader() &&
ReadProgramHeader() &&
ReserveAddressSpace() &&
LoadSegments() &&
FindPhdr();
所以,so的裝載是一種解析式裝載,這與dex有一定區(qū)別捣炬,dex是先加載進(jìn)行優(yōu)化驗(yàn)證生成odex熊昌,再去解析odex文件,而so更像邊解析邊裝載湿酸,在裝載過程中主要解析是load段
分配soinfo:
soinfo_alloc函數(shù)婿屹,生成了一個(gè)soinfo結(jié)構(gòu)
鏈接:
soinfo_link_image函數(shù),也就是soinfo結(jié)構(gòu)鏈接鏡像推溃,從而得到一個(gè)以后用的鏡像文件
so中用于動態(tài)鏈接的結(jié)構(gòu)就是.dynamic節(jié)昂利,即動態(tài)節(jié)區(qū)
a.定位動態(tài)節(jié)
b.解析動態(tài)節(jié)
c.加載依賴so
d.重定位:
主要函數(shù)為soinfo_relocate,此函數(shù)會被soinfo_link_image函數(shù)調(diào)用
解析重定位項(xiàng):.rel(.plt安卓并不用)铁坎,重定位表
導(dǎo)入符號信息:.dynsym蜂奸, 符號表
修正需要重定位的地址