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大致如下:

ActivityManager: WARNING: linker: libdvm.so has text relocations. This is wasting memory and is a security risk. Please fix.

在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

dlopen failed: /data/app/xxx/lib/arm/libinspos.so : has text relocations相关推荐

  1. dlopen failed: “/system/app/googlewebview85/lib/arm/libwebviewchromium.so“ is 32-bit instead of 64

    前言 最近用腾讯的tbs x5内核加载链接时 webview崩溃了 无限崩溃的那种 崩溃的错误也是一脸懵逼 /system/app/googlewebview85/lib/arm/libwebview ...

  2. java.lang.UnsatisfiedLinkError: dlopen failed: /data/app/***.so: has text relocations

    最近接手一个古老的项目维护-- 报错信息: 2020-04-23 19:15:44.652 19941-20327/xxx E/AndroidRuntime: FATAL EXCEPTION: Asy ...

  3. Caused by: java.lang.UnsatisfiedLinkError: dlopen failed: /data/app/com.google.android.webview-2/li

    最近的项目,部分华为手机用户反馈内部网页无法打开.也就是WebView无法正常使用. 通过查看友盟的错误统计信息,如下图所示: Caused by: java.lang.UnsatisfiedLink ...

  4. java.lang.UnsatisfiedLinkError: dlopen failed: /data/app/**********/lib/arm/libapp_BaiduPanoramaApp

    https://blog.csdn.net/mr_jianrong/article/details/72675425

  5. java.lang.UnsatisfiedLinkError: dlopen failed: /data/app/tv.danmaku.ijk.media.sample-2/lib/x86/libij

    这是ijk的包缺少armX86-64的问题 添加对应的即可 下面对为什么部分机型会错误的原因分析(注JCVD是开源安卓视频播放器,分析摘自issues,也是本人回答的) android下目前有这几种架 ...

  6. 百度地图---dlopen failed: /data/data/com.zoommax.car/files/libs/libBaiduMapSDK_base_v4_2_1.so is 32-bi

    错误1:No implementation found for int com.baidu.platform.comjni.tools.JNITools.initClass 错误2:loadExcep ...

  7. java.lang.UnsatisfiedLinkError: dlopen failed: /data/xxxxx.so has bad ELF magic

    java.lang.UnsatisfiedLinkError: dlopen failed: "/data/xxxxx.so" has bad ELF magic 原因是引入的.s ...

  8. java.lang.UnsatisfiedLinkError: dlopen failed: quot;/data/app/lib/arm/libiProtectPAB.so invalid

    这个关于android的第三方或者是本库的.so文件找不到或者是无效问题所在.看了很多java.lang.UnsatisfiedLinkError:错误信息大多讲的是不能找到.so文件,,而这里却是. ...

  9. android 8(O)预装APP到data/app目录

    需求 想内置应用到/data/用户区,让其可卸载 系统android 8(O) android 11可查看另外一篇<android 11®预装APP到data/app目录> 集成步骤 假设 ...

最新文章

  1. c#直接调用ssis包实现Sql Server的数据导入功能
  2. 为什么说Netty是性能之王,因为它用了 Reactor 模型啊
  3. htc在ubuntu上找不到devieces,提示权限不够的解决方法
  4. 读取raw目录中的文件数据
  5. Silverlight游戏设计(Game Design):(五)面向对象的思想塑造游戏对象
  6. shell编程面试必会30题
  7. java概述、安装、配置环境、运行
  8. ElasticSearch查询 第四篇:匹配查询(Match)
  9. oracle10g数据库复制,oracle -10g 中Duplicate 复制数据库
  10. java 泛型重载_Java泛型编程与多态、重载的同与不同
  11. Spring Boot基础学习笔记07:Spring Boot整合JPA
  12. jumpserver开源堡垒机部署安装
  13. Syntax error: Bad for loop variable
  14. mac上有哪些好用的图表软件?
  15. 《人性的弱点》-[美]戴尔·卡耐基
  16. PMP考试中的各种图总结
  17. 微信小程序渲染图片报错:[渲染层网络层错误] Failed to load local image resource
  18. 电脑派位系统(新生入学摇号) v2016
  19. k8s自定义controller三部曲之三:编写controller代码
  20. ETL工程师_个人职责

热门文章

  1. gettimeofday飞快的根因:vdso
  2. mysql 行级排它锁_Mysql的行级锁 -- 共享锁和排他锁
  3. python opencv随机位置添加水印图
  4. VUE ElementUI中table框设置文字超出隐藏及设置提示框样式
  5. 2017 年了,这么多前端框架,你会怎样选择?
  6. 蓝桥杯2019初赛 外卖店优先级 java
  7. 那个一直准点下班的人,比我先升职了......
  8. 经典MySQL的sql语句面试题
  9. 出现Python OSError: [Errno 22] Invalid argument的来龙去脉
  10. android对图片提升清晰度,android – ImageView加载高分辨率图像质量非常差