安卓ART ELF和Linux ELF文件有何区别?

3
它已在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和架构存在差异,但这两种格式之间是否存在结构或其他显著差异?
如果架构相同(因为Android已移植到x86),这些格式是否兼容?
还是这两种文件格式完全不同?

这里有一个解释:[https://www.google.com/events/io/io14videos/b750c8da-aebe-e311-b297-00155d5066d7],时间为6:30到10:00。 - Enkelli
1个回答

4

自制解释:在PDF(Dalvik和ART)中,您可以找到“OAT文件实际上嵌入在ELF对象文件中”(在PDF的第16页中,您可以看到OAT结构)。文件结构与维基百科上相同。这是可能的,因为ELF“设计灵活且可扩展,并且不受任何特定处理器或架构的限制”。

来自维基百科上的elf格式:使用 Android Runtime(ART),默认自 Android 5.0“棒棒糖”起,所有应用程序在安装时都会被编译为本机 ELF 二进制文件。

结论:你的问题的答案是,gcc elf 和 android elf 是相同的文件格式。关于这个格式,你可以在维基百科上找到更多信息。

更新

“如果体系结构相同,这些格式是否兼容?”

Readelf适用于Android oat文件(我拥有的应用程序之一已进行检查),显示oat文件类型为“DYN(共享对象文件)”。它类似于.so文件,如果您的项目使用JNI库,则可以看到这些文件。即使为相同的架构构建,这些elf文件也与通常的GNU / Linux elf文件不兼容,因为它们使用了Android中的“bionic系统库函数和动态链接器”。有关它们为什么不兼容的更多描述,请参见此处。有关Bionic的更多信息,请参见wiki


这些格式是否兼容,如果架构相同(因为Android已经移植到x86)?.. 这个问题还没有得到回答。 - Aniruddha Sarkar
我在问题更新中添加了更多内容(没有在评论中发布,因为我试图添加更多描述,但在评论中看起来很尴尬)。 - Yaroslav Havrylovych

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接