您的位置:首页 > 移动开发 > Android开发

Android dlopen failed: has text relocations

2016-10-28 18:48 113 查看

问题

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问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android
相关文章推荐