Android:dlopen() 返回 64 位架构的悬挂指针

标签 android c linux x86-64 dlopen

我已经为 32 位和 64 位架构构建了我的应用程序

APP_ABI := x86_64 x86 armeabi-v7a arm64-v8a

我正在 JNI 端执行 dlopen()。对于 32 位架构 dlopen() 工作正常并返回一个有效的空指针。 我能够在 struct soinfo 中键入此指针。 32 位的 dlopen() 转储如下。

libjavacore.so\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\004\F0۱\00\00\00\00\00\00\00\00\F0۱\00\80\00\00\00\00\00\D0C߱\00\00\00\00\00\00\00\00\F4\83\F5\B4\00\00@\A8ܱH\F1۱ \00\00\E6\00\00$jܱHrܱ\00\00\00\00\A0\ADܱ\80\00\00\E0}ܱ\F8\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\ACC߱\00\00\00\00\00\00\00\00\00\00\00\A6ޱ\91\00\00\00\00\00\00\F0۱\A4\82\F5\B4\D0C߱\F8\F4d\ADx\DFԵ\00\00\00\00\F0۱\00\00\00\00\00\00\00\00\B3\00\00\A3\00\00\E4OӶ\ACp汴y汴y\E6\B1\00\00\00\00\00\00\00\00\00\00\00\00tJ\00\00libmedia_jni.so\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\004\00\82\AD\00\00\00\00\00\00\00\00\00\82\AD\00\D0\00\00\00\00\00ܰ\85\AD\00\00\00\00\00\00\00\00D\85\F5\B4\00\00@\E8<\82\ADH\82\AD  \00\00\BA\00\00\9C͂\AD\C0Ղ\AD\00\00\00\00\80\83\AD\00\00\A8䂭{\00\00\00\00\00\00\00\00\00\00Ȱ\85\AD\00\00\00С\85\AD\00\00\00\00\00\00\00\00\00\00\00\ۄ\ADk\00\00\00\00\00\00\00\82\AD\F4\83\F5\B4ܰ\85\ADH\F6d\ADH\86\F5\B4\00\00\00\00\00\82\AD\00\00\00\00\00\00\00\00\B3\00\00\B3\00\00\BCp\E6\B1\FCq\E6\B1\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\AC\90\00\00libexif.so\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\004@\AD   \00\00\00\00\00\00\00\00@\AD\00\C0\00\00\00\00\00\E4쁭\00\00\00\00\00\00\00\00\94\86\F5\B4\00\00@\BCL\AD\8CA\AD\83\00\00\00\B3\00\00\00\88Z\AD\94\\AD\00\00\00\00Ȥ\AD\85\00\00\00`_\AD\AD\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\E0쁭\00\00\00\00\00\00\00\00\00\00\00D[\80\AD\89\00\00\00\00\00\00\00@\ADD\85\F5\B4\E4쁭\F8\84\F5\B4\98\87\F5\B4\00\00\00\00@\AD\00\00\00\00\00\00\00\00\B3\00\00x\00\00r\E6\B1\r\E6\B1q\E6\B1q\E6\B1\00\00\00\00\00\00\00\00

但是对于 64 架构 dlopen() 没有返回一个有效的指针。而且我无法将其类型转换为 struct soinfo。下面是 64 位的 dlopen() 转储

@\F0hn\FC\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\F0hn\FC\00\00\00p\00\00\00\00\00(on\FC\00\00\98\9D[t\FC\00\00A\00\00@\00\00\00\00h9in\FC\00\00\88\F2hn\FC\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00`jn\FC\00\00\8D\00\00\00\00\00\00p\95in\FC\00\00\AA\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00(on\FC\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\F0hn\FC\00\00Pԉt\FC\00\00(on\FC\00\00p\9E[t\FC\00\00\90\9A[t\FC\00\00\00\00\00\00\00\00\00\00\F0hn\FC\00\00\00\00\00\00\00\00\00\00\FD\00\00\00\00\00\00\00\00\00\00\00\00#pt\FC\00\00X"pt\FC\00\00/pt\FC\00\00/pt\FC\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00P\00\00\00\00\00\00\83\00\00\00\00\00\00\00\8Ain\FC\00\00<\83in\FC\00\00\00\00\00
\00\00\00\90\89in\FC\00\00\A8\9B[t\FC\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\859in\FC\00\001\00\00\00\00\00\00\00\00\00\00\00\00\00\00Pԉt\FC\00\00\8Fin\FC\00\00\F4\94in\FC\00\00\00\00\00\00\00\00\00\95in\FC\00\00\00\00\00\00\00\00\00'\00\00\00\00\00\00@`?i\FC\00\00    \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00`?i\FC\00\00\00\A0\00\00\00\00\00\F8\ACGi\FC\00\00\00\B8l\FC\00\00A\00\00@\00\00\00\00\D8\C6?i\FC\00\00\88b?i\FC\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00-Ai\FC\00\00\A2\00\00\00\00\00\00\F0\91@i\FC\00\00w\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00ЬGi\FC\00\00\00\00\00\00\00\00\00\80~Gi\FC\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00`?i\FC\00\00\D0ԉt\FC\00\00\F8\ACGi\FC\00\00\E0\00\B8l\FC\00\00\80\9C[t\FC\00\00\00\00\00\00\00\00\00\00`?i\FC\00\00\00\00\00\00\00\00\00\00\FD\00\00\00\00\00\00\00\00\00\00\00\00H!pt\FC\00\00\98&pt\FC\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\AF\00\00\00\00\00\00   \00\00\00\00\00\00\F8w@i\FC\00\00\9Cx@i\FC\00\00?\00\00\00\00\00\00\F8u@i\FC\00\00\98\9D[t\FC\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\F5\C6?i\FC\00\001\00\00\00\00\00\00\00\00\00\00\00\00\00\00\D0ԉt\FC\00\00T\89@i\FC\00\00\B0\91@i\FC\00\00\00\00\00\00\00\00\00̑@i\FC\00\00\00\00\00\00\00\00\00'\00\00\00\00\00\00\00\00\00\00\00\00\00\00 

是否有任何其他方法可以为 64 位架构执行 dlopen()。 我还查看了 Android 6 的 Android binoic 源代码,但没有找到任何解决方案。

最佳答案

dlopen 的返回值是一个不透明句柄,可以用 void * 类型表示。没有理由认为您应该能够取消引用它。如果 bionic 支持它们,dlinfodl_iterate_phdr 可能会为您提供所需的信息。

关于Android:dlopen() 返回 64 位架构的悬挂指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42827085/

相关文章:

java - 当我尝试将 Firebase 数据库中的项目包含在其项目列表中时,如何修复微调器不断关闭并重新打开的问题

java - 为什么在 java 中使用 FileReader 时找不到我的文件

c - mmap 有时会失败

c - 我的 C 程序出现了一些错误。无论我做错了什么,请帮助我

linux - 在变得不可行之前,父进程可以生成多少个子进程?

php - 检查文件的最后一行下面是否有东西

linux - GIT 提交后,我做了 GIT 推送,但消息说一切都是最新的

android - Android通知时间格式是如何更新的?

javascript - 客户端浏览器可以在我们的网站上添加JavaScript吗?

c - C 如何使用 read 系统调用读取字节?