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 6.0下出错: UnsatisfiedLinkError: dlopen failed . text relocations
- Android 6.0下出错: UnsatisfiedLinkError: dlopen failed . text relocations
- java.lang.UnsatisfiedLinkError: dlopen failed:has text relocations
- android 6.0 and sdk23, when used xx.so has text relocations. bug
- Android开发6.0出现java.lang.UnsatisfiedLinkError...xxx.so has text relocations
- [Android exception] /data/app/com.tongyan.tutelage-1/lib/arm/libstlport_shared.so: has text relocations
- Android 6.0 crash - liblicensing.so: has text relocations
- android 6.0 and sdk23, when used xx.so has text relocations.
- android so一种异常: has text relocations
- has text relocations 6.0 M android 环信 so 文件 sdk 版本过低 适配Android6.0
- Android报错:调用so库时“xxx.so has text relocations”
- java.lang.UnsatisfiedLinkError… has text relocations 问题解决办法
- Android SDK content Loader has encountered a problem.parseSdkContent failed
- 优酷SDK导致so加载失败 has text relocations
- Eclipse reports that Android SDK Content Loader has encountered a problem. parseSdkContent failed.
- Android开发之错误:elicpse运行时弹出Running Android Lint has encountered a problem failed, nullpointerexception
- Android JNI之——UnsatisfiedLinkError errordlopen failed: cannot locate symbol "rand"
- libdvm.so has text relocations 错误
- Android Studio新体验之android failed to complete gradle execution a fatal exception has occurred
- android release export has encountered a problem conversion to dalvik format failed with error 1