有没有办法在linux aarch64(cent7 arm)上运行.so库(由NDK为android aarch64编译)?

问题描述 投票:0回答:2

我有一个已编译的aarch64共享库(

my_custom.so
),它已成功集成到APK中并在Android设备上运行。因为它是一个独立的低级计算库,不依赖于 Android 系统组件

我正在探索创建包含此库的 Linux aarch64 可执行文件的可能性。这将在服务器端启用相同的功能,作为 Android 设备的替代方案,利用常见的 aarch64 架构

遗憾的是,

my_custom.so
的源代码丢失了。

我通过ldd、readelf等命令确认my_custom.so只依赖于libc.so、libc++_shared.so、liblog.so、libz.so。

但是,有一个错误表明库/lib64/libc.so有一个无效的ELF头:“/lib64/libc.so无效的elf头。

使用cat命令后,确认/lib64/libc.so实际上是一个文本文件,实际的库文件是/lib64/libc.so.6。当我尝试创建从 /lib64/libc.so 到 /lib64/libc.so.6 的符号链接时,我遇到了错误:找不到版本 glibc

我推测这种差异可能是由于 my_custom.so 是使用 NDK 编译的,该 NDK 使用的 libc 库与我当前的 Linux aarch64 环境中存在的库不同。因此,我试图在NDK的平台目录中找到相应的libc库。

我从

NDK的平台目录复制了libc.so并在my_custom.so之前加载它,但遇到了**“未页面对齐”**错误。谷歌的研究表明,这可能是由于库与较大的页面大小不相符。由于当前系统的内存页面大小是不可修改的,我现在正在寻找 libc.so 的替代版本

从NDK中的

/toolchains/llvm/prebuilt/复制libc.so后,我用ldd验证了它。我还从llvm目录复制了libc++_shared.so,也通过了ldd验证。

但是,当我运行整个程序时,它导致了核心转储......

我想知道是否可以在 Linux aarch64 上运行 .so 库(由 NDK for Android aarch64 编译)。如果可以的话,我的做法正确吗?接下来我应该做什么?

我推测利用QEMU或Anbox等技术在Linux上运行Android虚拟机可能是一个可行的解决方案。但考虑到 my_custom.so 不依赖于任何 Android 系统组件,我发现虚拟机方法相对复杂且占用资源,导致潜在的资源浪费。

linux android-ndk arm64 libc
2个回答
1
投票
因为它是一个独立的低级计算库,不依赖于Android系统组件

你的前提是错误的。它取决于 Android 加载器和 C 库。它不能在 GNU 系统上运行。


0
投票
我想知道是否可以在 Linux aarch64 上运行 .so 库(由 NDK for Android aarch64 编译)。如果可以的话,我的做法正确吗?接下来我应该做什么?

这并非“完全”不可能,但它很困难、复杂且脆弱。我已经简单地做到了,但是我使用的 aarch64 VM 很快就停止工作了,我放弃了这个想法。

对您来说最好的做法是重建 my_custom.so

的来源。有了它,您就可以为 Linux 构建正确的版本。

© www.soinside.com 2019 - 2024. All rights reserved.