【问题标题】:Is it possible to run a statically-linked ELF binary on Android?是否可以在 Android 上运行静态链接的 ELF 二进制文件?
【发布时间】:2017-03-20 10:00:53
【问题描述】:

Android 基于 Linux 内核,据我所知,静态链接的 ELF 二进制文件只需要内核即可运行。尽管 Android 不包含 glibc,但系统调用接口应该仍然存在,并内置在内核中。我知道静态链接时任何实际应用都会巨大,但这纯粹是假设。行得通吗?

【问题讨论】:

    标签: android elf static-linking


    【解决方案1】:

    对于 Android 上的原生开发,您通常会创建原生 .so 库,这些库需要针对每种支持的架构进行交叉编译(armarm64mipsx86、@ 987654325@)。 APK 可以使用 JNI 调用来加载这些库。

    虽然您可以使用 ELF 二进制文件(.so 文件是使用 gcc 等标准编译器生成的),但对于您希望在其上运行应用程序的每个目标架构,您都需要一个。

    虽然 Android 可以分别为 x86_64arm64 加载 x86 或 arm 版本的 .so 文件,但建议创建所有 4如果那是您所支持的版本。本机库是根据文件夹结构加载的。

    示例: 仅当 lib/arm64 不存在时,arm46 系统才会从 lib/arm 加载 arm .so 文件。结果是任何包含 lib/arm64 的库都会导致您的应用在 arm64 系统上中断,除非您同时包含 armarm64 版本。

    【讨论】:

      【解决方案2】:

      我想你想要做的是在你的 Linux 机器上获取一些静态库并将它们与你自己的目标文件静态链接,以试图克服它们在 Android 上的缺失。问题在于这两台机器几乎可以肯定不使用相同的 CPU 架构,因此这些库不是为 Android 构建的,并且机器代码不会被 Android“理解”。从理论上讲,您还必须交叉编译这些库并将您的程序与之链接。

      不过,Android 已经有一个名为 Bionic 的标准 C 库。它取代了 Android 上的 glibc。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-04
        • 1970-01-01
        • 2015-02-27
        • 2017-04-08
        • 1970-01-01
        • 1970-01-01
        • 2014-10-19
        相关资源
        最近更新 更多