android so文件加載連接簡單理解
這是我自己學習筆記轉載過來的,很簡單,很粗糙,見諒,想要詳細瞭解的推薦上github上manyface大神的android so文件從加載到鏈接詳解。。。
過程很簡單,將so文件加載到內存,之後再鏈接
加載過程中,真正加載的是dlopen函數裏面的JNI_OnLoad函數,調用JNI_Onload的時候需要使用dlsym()函數找到JNI_Onload的地址
dynamic section:對象文件參與鏈接的時候解析:
假如一個object文件參與動態的連接,它的程序頭表將有一個類型爲PT_DYNAMIC
的元素。該“段”包含了.dynamic section。一個_DYNAMIC特別的符號,表明了
該section包含了以下結構的一個數組。
+ Figure 2-9: Dynamic Structure
typedef struct {
Elf32_Sword d_tag;
union {
Elf32_Sword d_val;
Elf32_Addr d_ptr;
} d_un;
} Elf32_Dyn;
extern Elf32_Dyn _DYNAMIC[];
對每一個有該類型的object,d_tag控制着d_un的解釋。
* d_val
那些Elf32_Word object描繪了具有不同解釋的整形變量。
* d_ptr
那些Elf32_Word object描繪了程序的虛擬地址。就象以前提到的,在執行時,
文件的虛擬地址可能和內存虛擬地址不匹配。當解釋包含在動態結構中的地址
時是基於原始文件的值和內存的基地址。爲了一致性,文件不包含在
重定位入口來糾正在動態結構中的地址。
init_array和init_fun代碼:初始化代碼,先於jni_onLoad執行,其中init_array主要給編譯器初始化c或者c++運行時庫,爲後續代碼準備運行環境。一般的加殼邏輯都在這兩段代碼中。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.