如何区分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,它会告诉您正在使用哪个动态链接器。这应该因系统而异。
我得到了一个 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,它会告诉您正在使用哪个动态链接器。这应该因系统而异。