1.OAT文件內(nèi)容
OAT文件其實(shí)就是一個(gè)elf格式的文件,結(jié)構(gòu)如下
Paste_Image.png
OAT有兩個(gè)section,一個(gè)是oat data section倚舀,里面存放了生成的oat的dex files的內(nèi)容姜挺,還有一個(gè)是oat exec section,里面存放的是從dex編譯出的native代碼寞奸。
oatdata section的結(jié)構(gòu)
Paste_Image.png
Paste_Image.png
2.OAT文件的加載
通過dlopen加載到虛擬內(nèi)存空間的共享庫(kù)區(qū)域,通過dlsym找到“oatdata”和“oatlastword”在跳,oatdata的地址即為OAT文件里面的oatdata段加載到內(nèi)存中的開始地址枪萄,而符號(hào)oatlastword的地址即為OAT文件里面的oatexec加載到內(nèi)存中的結(jié)束地址,通過讀取oatdata section中的內(nèi)容創(chuàng)建出OatFile猫妙,OatClass瓷翻,OatMethod等數(shù)據(jù)結(jié)構(gòu)