问题
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:
- 效率相关: 使用PIC后, 代码可以被加载到内存的任意位置, 即不存在某段代码始终对应特定物理地址的情况, 这样的方式, 适用于共享对象的加载
换个说法, 使用PIC的共享对象, 在内存中是真正”共享”的; 而未使用PIC的共享对象, 在被不同进程加载的过程中, 会产生多个copy, 从而引入效率问题.
- 安全相关: 使用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问题