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++運行時庫,爲後續代碼準備運行環境。一般的加殼邏輯都在這兩段代碼中。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章