20160617更新:
使用Android 6.0的NDK重新编译so文件, 即可解决问题.
===================================================================
20151017内容:
首先贴一下这个问题的官方答复:
https://code.google.com/p/android-developer-preview/issues/detail?id=3028
先介绍一下这个问题的背景 (没兴趣看的, 可以直接跳到下文的问题解决方案):
1. 这个问题出现在loadLibrary()的过程中.
2. 在Android 6.0之前, text reloactions问题, 会在编译的过程中, 作为warning报出来, log大致如下:
在Android 6.0中, 原来的warning被升级为error了. 因此, 同样的库文件, 在Android 6.0前的环境运行, 不报错, 6.0下就会crash掉.
3. 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的过程.
解决方案:
方案一 (官方推荐):
1. 在这里有Google的同事推荐的方案
2. 以下是解决步骤:
操作步骤: https://wiki.gentoo.org/wiki/Hardened/Textrels_Guide
这里面东西好多你不会想看我再写一次的所以自己看吧
一句概括要做的: 通过scanelf / objdump定位存在TEXTREL问题的文件, 以及关键代码在文件中的偏移量, 然后根据偏移量对应的特征 (函数名 / hard code的绝对地址等), 定位到代码所在.
方案二 (简单但会影响程序效率):
在mk脚本中, 对LOCAL_CFLAGS, 增加-fPIC参数, 同时按需求配置链接库的参数. 此方案的参考源是这里.
=====================================================================
相关参考资料:
1. TEXTREL问题的官方回复: https://code.google.com/p/android-developer-preview/issues/detail?id=3028
2. TEXTREL问题分析定位: https://wiki.gentoo.org/wiki/Hardened/Textrels_Guide
3. Android 5.0安全性增强描述文档: https://source.android.com/devices/tech/security/enhancements/enhancements50.html
4. PIC的wiki: https://en.wikipedia.org/wiki/Position-independent_code
5. Oracle关于PIC的描述: https://docs.oracle.com/cd/E19683-01/816-1386/chapter4-29405/index.html
6. RedHat关于PIE的描述: https://securityblog.redhat.com/2012/11/28/position-independent-executables-pie/
7. StackOverflow上对Android 5.0 PIE问题的解决方案: http://stackoverflow.com/questions/30498776/position-independent-executables-and-android-lollipop
相关推荐
Java中的`java.lang.UnsatisfiedLinkError`是一个常见的运行时异常,通常出现在Java试图加载本地(C或C++)库但找不到相应的库文件时。这个错误可能是由于多种原因引起的,如库路径设置不正确、库文件不存在或者版本...
解决方案:Exceptionin thread "main" java.lang.UnsatisfiedLinkError:org.apache.hadoop.util.NativeCrc32.nativeCo
imsdroid 在android7.0运行时会提示“java.lang.UnsatisfiedLinkError: dlopen failed: has text relocations”,使用本资源包替换android-ngn-stack 项目中libs中的so库即可解决。
本文件夹专为以下错误对症下药。...Exception in thread "VFW Request Thread" java.lang.UnsatisfiedLinkError: JMFSecurityManager: java.lang.UnsatisfiedLinkError: no jmvfw in java.library.path
之前tomcat启动老是报错,虽然不影响项目的启动运行,但是有强迫症的程序员会心里不爽: 如下: 问题分析 由于本机安装的jdk版本与tomcat中使用的jdk版本不一致导致的。 解决方法 后面我把原先tomcat启动环境用的...
解决java引入sigar运行时报错"java.lang.UnsatisfiedLinkError: org.hyperic.sigar.Mem.gather",将压缩包解压后,放入本地项目lib中即可解决该类问题,该jar包由官网下载
在Android系统中,串口通信是一种重要的硬件交互方式,它允许设备与外部设备(如传感器、控制器等)进行数据交换。`libserial_port.so`是一个动态链接库,专门用于实现Android平台上的串口驱动功能。这个库文件是C或...
关于安卓串口开发,这篇文章写...java.lang.UnsatisfiedLinkError: dlopen failed: ××××.so: has text relocations 这个因为编译的 so 文件太旧了。 示例源码中,修改了上述问题,并提供演示示例,可正常运行。
最近我们发现很多用户...java.lang.UnsatisfiedLinkError: couldn't find libarcsoft_face_engine.so 原因: 在安装应用时,APK中指定的ABI目录下没有发现指定的动态库,寻找apk中动态库的规则详见 https://developer
最近在做supervideo,解析youku视频地址,是加过密处理,须要用对应的key去解析,获取对应数据,在引用jni时,发现接二连三出问题,以前用eclipse时开发,直接把so文件放在libs/armeabi/下,就可以了,如果有有平台...
我在进行MapReduce本地测试的时候,遇见下面的报错: Exception in thread “main” java. lang . UnsatisfiedLinkError: org. apache . hadoop. io. nativeio. NativeIOSWindows . access0 (Ijava...
串行端口库 序列化串口封装库(包含源码) 相关问题 问题1 java.lang.UnsatisfiedLinkError:dlopen失败:/data/app/...因此,同样的库文件,在Android 6.0前的环境运行,不报错,6.0下就会崩溃掉。 解决方案:
报错:java.lang.Exception: java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z 所需文件
Myeclipse 8.5中,web项目部署到resin上运行时,报错:java.lang.UnsatisfiedLinkError: no ocijdbc10 in java.library.path。 解决方法一:将D:\oracle\product\10.2.0\client_1\BIN 下的ocijdbc10.dll...
适用RK3288 android 9.0 SDK, 解决加载 /system/lib/libserial_port.so 时 java.lang.UnsatisfiedLinkError: dlopen failed: library
loadLibrary msc error:java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file “/data/app/...在buidl.gradle(module:app)下的android{ defaultConfig {
Window系统无法调用OpenCV代码报错:java.lang.UnsatisfiedLinkError: Directory separator should not appear in library name: C:\Windows\System32\opencv_java343.dll。出现该问题主要是安装的Windows系统缺乏...
安装jpcap报错:Exception in thread "main" java.lang.UnsatisfiedLinkError: C:/Windows/System32/Jpcap.dll: Can't find dependent libraries 解决办法。
这些文件存在表明系统中应该安装了`libstdc++.so.6`,但是运行的程序仍然报错,这可能是因为以下几个原因: 1. **版本不匹配**:虽然系统中有`libstdc++.so.6`,但版本可能与程序要求的版本不一致。 2. **路径问题*...