Android dlopen failed: has text relocations

問題

apk加載so時,產生has text relocations錯誤。
經過測試發現和targetSdkVersion有關,這個問題出現在加載so時,編譯時sdk小於23 也就是android6.0之前是報warning,6.0之後直接報error。

分析

text reloactions又被稱爲TEXTREL, 它與PIC相關, 先說PIC:
PIC: Position Independent Code, 指一段代碼, 在加載到內存後, 其物理地址與代碼本身是無關的.
爲什麼要使用PIC:

  1. 效率相關: 使用PIC後, 代碼可以被加載到內存的任意位置, 即不存在某段代碼始終對應特定物理地址的情況, 這樣的方式, 適用於共享對象的加載
    換個說法, 使用PIC的共享對象, 在內存中是真正”共享”的; 而未使用PIC的共享對象, 在被不同進程加載的過程中, 會產生多個copy, 從而引入效率問題.

  2. 安全相關: 使用PIC後, 特定代碼被加載的內存地址不確定, 這樣可以避免某些內存地址敏感的攻擊. RedHat有一篇相關的文章: https://securityblog.redhat.com/2012/11/28/position-independent-executables-pie

    回到TEXTREL, 它實際上是源碼中存在”特定代碼映射特定地址”. 加載代碼時, 必須將其加載到特定物理地址, 導致調用這些代碼時, 必需增加一個relocation的過程.

解決方法:

方法一:

將targetSdkVersion改爲低於23

方法二:

在Android.mk中,LOCAL_CFLAGS, 增加-fPIC參數 

在調用第三方so時,dlopen 在android6.0上,不光存在sdk版本問題,加載不是/lib目錄下的so還會有permission denied問題

發佈了28 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章