RPATH无法让原生应用在Android上找到共享库



我构建了一个本机可执行文件,它使用gpu委托运行推理。这个可执行文件依赖于我复制到同一目录的libtensorflowlite_gpu_delegate.so。然而,当我运行它时,我得到错误说没有找到这个共享库,所以显然,我需要将RPATH设置为./,并且可执行文件能够找到这个共享库。

但随后我又遇到了另一个错误:"libOpenCL。所以没有找到。我在/system/vendor/lib64中找到了这个共享库,所以我将它复制到相同的目录中,并且一切正常。

然而,如果系统已经有这个共享库,我不想复制它,所以我将/system/vendor/lib64RPATH添加到我的可执行文件中,并与readelf确认:

Dynamic section at offset 0x9fc0058 contains 40 entries:
Tag                Type                 Name/Value
0x000000000000001d (RUNPATH)            Library runpath: [/system/vendor/lib64/:./]

然而,有了这个新的RPATH,我仍然得到错误说"libOpenCL。所以没有找到。不确定这是否是访问约束,但我在adb shell下启用su。并且该文件具有-rw-r--r--

的可访问性我的问题是:
  1. 为什么设置RPATH在这里不起作用?
  2. 我觉得这可能不是让我的原生应用在系统文件夹下找到原生库的最好方法,我有另一个可以使用GPU委托的非原生应用。我读的文档说any native shared library is accessible regardless of whether it is an NDK library至少为API_LEVEL我有。所以我想知道是否有办法为本地构建的应用添加访问权限?

因为应用程序不允许访问供应商库:https://android.googlesource.com/platform/bionic/+/master/android-changes-for-ndk-developers.md#private-api-enforced-for-api-level-24

最新更新