如何区分Android和传统Linux上的ELF文件运行?

How to distinguish ELF files running on Android and on traditional Linux?

我得到了一个 ELF(可执行和可链接格式)文件,如何知道它应该用于传统的 Linux 平台还是 Android 平台?

在Android,大部分是.so文件。 我尝试使用一些嵌入在文件中的字符串,如 JNI 函数或 "Ljava" 库来区分它们,但结果似乎不太好。

有没有更准确的区分方式?

您可以通过使用 readelf --dynamic 读取 DT_NEEDED 条目并使用 libc 的 SONAME 区分它们来做到这一点。在 glibc 系统上,您可能有 libc.so.6,尽管那里还有其他 libc,例如 musl。 Android 使用的 libc 是 Bionic,因此它可能会有所不同。

这不适用于静态二进制文件,例如大多数 Go 二进制文件,但大多数人不会为 Android 分发静态二进制文件。

对于可执行文件,您可能还希望阅读 PT_INTERP header,它会告诉您正在使用哪个动态链接器。这应该因系统而异。