Android Chroot环境下跨libc调用libvulkan.so的高效方案问询
场景说明
以下是具体场景:
- 已在获取root权限且禁用SELinux的Android chroot环境中操作
- chroot内有一个链接glibc的程序,因无源码无法重新链接
- 该程序需要加载并调用
/system/lib64/libvulkan.so(Vulkan Loader)的导出函数,而此库链接的是Android的Bionic libc - 同一进程内存无法同时加载两个libc,尝试后触发SIGTRAP信号
如何高效实现该调用(避免Vulkan额外开销)?
我的可行方案构想
方案一
- 构建一个Vulkan"服务端"程序,加载
libvulkan.so,开启IPC共享内存,将封装后的Vulkan函数指针写入共享内存 - 构建一个伪
libvulkan.so作为Vulkan"客户端"供目标程序加载,伪库导出与真实库相同的内容,将调用重定向到共享内存中的函数指针
注:无法通过共享内存导出函数指针
方案二
- 与方案一类似,但不通过共享内存导出函数指针:
- 伪
libvulkan.so(客户端)将API名称(或ID等)、函数参数等写入共享内存 - Vulkan"服务端"程序通过循环监听共享内存中的调用请求,将请求重定向到真实
libvulkan.so
注:对于涉及内存地址的API,Vulkan无法访问目标程序的内存
方案三
与方案二类似,但针对涉及内存地址的参数,在Vulkan"服务端"分配临时缓冲区传递给真实Vulkan API,再将缓冲区返回给伪libvulkan.so(客户端)
注:理论可行,但效率较低
又陷入依赖困境了 :(
内容的提问来源于stack exchange,提问作者raspiduino
相关产品推荐
相关产品推荐

