android - android art elf和linux elf文件有什么区别?

标签 android linux gcc runtime elf

在 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/

相关文章:

android - 为什么要使用 Intent.URI_INTENT_SCHEME

linux - 如何在 Amazon AWS EC2 上安装 GUI

c - 如何在 Windows 上更新安装 GCC 11.2

c - GCC 相关搜索目录

c - 为什么 scanf ("%hhu", char*) 覆盖其他本地变量?

java - 如何纠正这个: Content is not allowed in prolog

android - onConfigurationChanged 没有被第二次调用

linux - 如何在树莓派上自动启动C++程序?

android - 我将为此 StoreBuilder 使用什么样的 key

linux - 如何导出 linux/Shell 脚本中两个工作区文件夹之间的差异?