TEXTREL是"文本重定位”的术语"。
在targetSdkVersion>=23 Android 6.0 以上设备上跑debug版本时,出现一下警告日志,当targetSdkVersion<23且使用debug签名的APK运行在高版本系统上(大于6.0)出现以下弹窗
2019-04-26 15:09:45.033 1685-2398/cn.mashang.vscreen W/linker: /data/app/cn.mashang.vscreen-2/lib/arm/libserial_port.so has text relocations. This is wasting memory and prevents security hardening. Please fix.

修复源码中的text relocations
问题原因,谷歌了一下
libxxx.so: text relocations 这个问题在Android 6.0官方的更新说明中有说到:
Android 6.0官方的更新说明
现已正确实现 dlopen(3) RTLD_LOCAL 标记。请注意,RTLD_LOCAL 是默认值,因此不显式使用 RTLD_LOCAL 的 dlopen(3) 调用将受到影响(除非您的应用显式使用 RTLD_GLOBAL)。使用 RTLD_LOCAL 时,在随后通过调用 dlopen(3) 加载的库中并不能使用这些符号(这与由 DT_NEEDED 条目引用的情况截然不同)。
在之前版本的 Android 上,如果您的应用请求系统加载包含文本重定位信息的共享库,系统会显示警告,但仍允许加载共享库。从此版本开始,如果您的应用的目标 SDK 版本为 23 或更高,则系统会拒绝加载该库。为帮助您检测库是否加载失败,您的应用应该记录 dlopen(3) 失败日志,并在日志中加入 dlerror(3) 调用返回的问题描述文本。要详细了解如何处理文本重定位,请参阅此指南。
参阅此指南 (难以理解)
定位问题
so文件有text relocations问题,用 readelf命令
如果你是macOS,mac os X下没有这两个命令,可以用brew来安装,brew update && brew install binutils ,然后配置环境变量
用法
readelf -a so文件路径 | grep TEXTREL

TEXTREL表示代码段重定位表地址,PIC的共享对象不会包含任何代码段重定位表。匹配不到TEXTREL则无问题
谷歌的android-serialport-api串口项目的so文件有TEXTREL问题,那采取较新的NDK编译后呢?text relocations 警告没了。
本文深入探讨了在Android6.0及更高版本中遇到的TEXTREL警告问题,详细解释了这一警告的产生原因,以及如何通过修改源码和使用较新的NDK编译来消除警告。文章提供了具体的解决方案,包括使用readelf命令定位问题所在,并介绍了如何避免文本重定位以增强应用的安全性和性能。

5497

被折叠的 条评论
为什么被折叠?



