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

时间:2016-02-27 11:29:22

标签: android linux gcc runtime elf

已在ART维基中进行了描述: https://en.m.wikipedia.org/wiki/Android_Runtime?_e_pi_=7%2CPAGE_ID10%2C1898354483 ,ART在安装时将apk文件编译为ELF文件。

GNU / Linux上的GCC也创建了ELF文件作为输出,最近而不是a.out格式。

我知道在这两种环境中API和architechtural都存在差异,但这两种格式是否有任何结构或任何其他显着差异?

这些格式是否相互兼容,如果架构相同(因为android已移植到x86)?

或者这两种文件格式完全不同?

1 个答案:

答案 0 :(得分:3)

自制解释:在PDF (Dalvik and ART)中,您可以发现“OAT文件实际上嵌入在ELF目标文件中”(在PDF的第16页上,您可以看到OAT结构)。文件结构与wiki上的文件结构相同。这是可能的,因为ELF“在设计上是灵活和可扩展的,并且它不受任何特定处理器或体系结构的约束”。

来自elf format on wikipedia:使用Android Runtime(ART),自Android 5.0“Lollipop”以来的默认设置,所有应用程序在安装时都会编译为本机ELF二进制文件。

结论:你的问题的答案是gcc elf和android elf是相同的文件格式。有关您在wiki上可以找到的格式的更多信息。

<强>更新

“如果架构相同,这些格式是否相互兼容”

Readelf对于android oat文件(使用我拥有的某个应用程序检查)显示燕麦文件类型为“DYN(共享对象文件)”。它类似于.so文件,如果您的项目使用JNI库,您可以看到它们。如果因为“bionic的系统库函数和动态链接器”(在android中使用)甚至构建用于相同的体系结构,那些elf文件与通常的GNU / Linux elf文件不兼容。有关为什么它们不兼容的更多说明,您可以找到here。仿生wiki