在 ART wiki 中有描述: https://en.m.wikipedia.org/wiki/Android_Runtime?_e_pi_=7%2CPAGE_ID10%2C1898354483 ,ART 在安装时将 apk 文件编译为 ELF 文件。
GNU/Linux 上的 GCC 也创建 ELF 文件作为输出,最近取代了 a.out 格式。
我知道这两种环境在 API 和架构方面存在差异,但这两种格式是否存在任何结构差异或任何其他显着差异?
如果架构相同(因为 android 已移植到 x86),这些格式是否相互兼容?
或者这两种文件格式完全不同?
最佳答案
自制解释:在PDF (Dalvik and ART)你会发现“OAT 文件实际上嵌入在 ELF 目标文件中”(在 PDF 的第 16 页你可以看到 OAT 结构)。文件结构与 wiki 上的相同.这是可能的,因为 ELF “在设计上是灵活和可扩展的,并且不受任何特定处理器或架构的约束”。
来自 elf format on wikipedia : 使用 Android 运行时 (ART),这是自 Android 5.0“Lollipop”以来的默认设置,所有应用程序在安装时都编译为 native ELF 二进制文件。
结论:你的问题的答案是gcc elf和android elf是同一种文件格式。您可以在 wiki 上找到有关格式的更多信息.
更新
“如果架构相同,这些格式是否相互兼容”
Readelf对于 android oat 文件(使用我拥有的应用程序之一进行检查)显示 oat 文件类型为“DYN(共享对象文件)”。它类似于您可以查看项目是否使用 JNI 库的 .so 文件。由于“bionic 的系统库函数和动态链接器”(在 android 中使用),即使是为相同的体系结构构建的,这些 elf 文件也不兼容通常的 GNU/Linux elf 文件。关于为什么它们不兼容的更多描述,您可以找到 here .仿生 wiki .
关于android - android art elf和linux elf文件有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35669145/