【发布时间】:2017-03-20 10:00:53
【问题描述】:
Android 基于 Linux 内核,据我所知,静态链接的 ELF 二进制文件只需要内核即可运行。尽管 Android 不包含 glibc,但系统调用接口应该仍然存在,并内置在内核中。我知道静态链接时任何实际应用都会巨大,但这纯粹是假设。行得通吗?
【问题讨论】:
标签: android elf static-linking
Android 基于 Linux 内核,据我所知,静态链接的 ELF 二进制文件只需要内核即可运行。尽管 Android 不包含 glibc,但系统调用接口应该仍然存在,并内置在内核中。我知道静态链接时任何实际应用都会巨大,但这纯粹是假设。行得通吗?
【问题讨论】:
标签: android elf static-linking
对于 Android 上的原生开发,您通常会创建原生 .so 库,这些库需要针对每种支持的架构进行交叉编译(arm、arm64、mips、x86、@ 987654325@)。 APK 可以使用 JNI 调用来加载这些库。
虽然您可以使用 ELF 二进制文件(.so 文件是使用 gcc 等标准编译器生成的),但对于您希望在其上运行应用程序的每个目标架构,您都需要一个。
虽然 Android 可以分别为 x86_64 和 arm64 加载 x86 或 arm 版本的 .so 文件,但建议创建所有 4如果那是您所支持的版本。本机库是根据文件夹结构加载的。
示例: 仅当 lib/arm64 不存在时,arm46 系统才会从 lib/arm 加载 arm .so 文件。结果是任何包含 lib/arm64 的库都会导致您的应用在 arm64 系统上中断,除非您同时包含 arm 和 arm64 版本。
【讨论】:
我想你想要做的是在你的 Linux 机器上获取一些静态库并将它们与你自己的目标文件静态链接,以试图克服它们在 Android 上的缺失。问题在于这两台机器几乎可以肯定不使用相同的 CPU 架构,因此这些库不是为 Android 构建的,并且机器代码不会被 Android“理解”。从理论上讲,您还必须交叉编译这些库并将您的程序与之链接。
不过,Android 已经有一个名为 Bionic 的标准 C 库。它取代了 Android 上的 glibc。
【讨论】: