Android安全交流群:478084054

先贴老罗的一张图:

再摘一段老罗的描述:“作为Android私有的一种ELF文件,OAT文件包含有两个特殊的段oatdata和oatexec,前者包含有用来生成本地机器指令的dex文件内容,后者包含生成的本地机器指令,它们之间的关系通过储存在oatdata段前面的oat头部描述。此外,在OAT文件的dynamic段,导出了三个符号oatdata、oatexec和oatlastword,它们的值就是用来界定oatdata段和oatexec段的起止位置的。”

老罗的这段描述,有些地方稍微有点不太准确。

符号oatdata、oatexec和oatlastword是动态符号表(.dynsym)中导出的,不是dynamic段导出的。

另外,oatdata和oatexec并不是OAT(ELF格式)文件中两个独立的段,而是分别位于第1个和第2个LOAD段中,这一点对比上面的.dynsym和下面的Program Headers Table就可以看出来了。

如何在OAT文件中找到一个类方法的本地机器指令呢?还是贴老罗的一幅图,再结合上图和老罗的一段描述(感谢老罗的博客)就可以大概理解了。

“首先根据类签名信息从包含在OAT文件里面的DEX文件中查找目标Class的编号,然后再根据这个编号在OAT文件中找到对应的OatClass。接下来再根据方法签名从包含在OAT文件里面的DEX文件中查找目标方法的编号,然后再根据这个编号在前面找到的OatClass中找到对应的OatMethod。有了这个OatMethod之后,我们就根据它的成员变量begin_和code_offset_找到目标类方法的本地机器指令了。”

下面以Android 6源码为例,看一下OatFile::Open函数(art/runtime/Oat_file.cc):

可以看到,有两个函数可以加载OAT文件:OpenDlopen和OpenElfFile。这两个函数有什么区别?继续摘老罗的博客(非原文,简化了一下):“ART运行时会为类方法生成相应的本地机器指令,这些本地机器指令可能会调用外部函数,这就涉及到模块依赖问题,就好像我们在编写程序时,需要依赖C库提供的接口一样。ART运行时支持两种类型的Backend:Portable和Quick。Portable类型的Backend通过静态链接器生成本地机器指令,通过重定位技术来处理模块依赖问题。这对熟悉linker动态加载过程的程序员来说很容易理解。而Quick类型的Backend生成的本地机器指令用另外一种方式来处理模块之间的依赖关系。简单的说,就是ART运行时会在每一个线程的TLS(线程本地区域)提供一个函数表,本地机器指令通过它来调用其它模块的函数。这使得生成的OAT文件在加载时不需要再处理模块之间的依赖关系,也就省去了重定位,不需要通过系统的动态链接器提供的dlopen来加载。这样OAT文件在加载时就会更快,这也是称其为Quick的缘由。”。

仔细看一下OatFile::Open,会发现参数executable为false时,不会执行OpenDlopen。什么情况下executable为false?如果是dex2oat过程中调用的OatFile::Open,参数executable就为false。

调用OpenDlopen加载非executable的OAT文件可能会失败,具体看函数注释:

主要看OpenElfFile函数:

继续跟OatFile::ElfFileOpen(省去了一些出错处理代码):

先Open文件,再Load加载,然后调用FindDynamicSymbolAddress找到OAT文件中的oatdata、oatlastword、oatbss、oatbsslastword四个符号的地址。

其中Open和Load的过程类似于linker的dlopen过程的,但没有重定位,仅仅是将OAT文件的LOAD段映射到内存,并解析出字符串表、符号表等重要信息的地址等等。

这里摘录Roland_Sun博客对这个过程的一点总结:1)如果elf文件中包含了虚拟地址为0的PT_LOAD段,则证明它不是Boot Oat,而是一个普通的应用程序的oat,这时候该elf文件无所谓被映射到内存中的任何地方,其虚拟地址(p_vaddr)中记录的是该段相对于文件头的偏移;

2)如果elf文件中没有包含任何虚拟地址为0的PT_LOAD段,则证明它是一个Boot Oat,必须被加载到一个指定位置(实际是紧接在Image之后),其虚拟地址(p_vaddr)中记录的就是实际要被加载的绝对地址。

Boot OAT的Program Header:

一个普通应用程序的OAT的Program Header:

回到OatFile::ElfFileOpen,继续看Setup函数。下篇笔记继续。

老罗android oat,入门ART虚拟机(5)——OAT文件相关推荐

  1. 老罗Android开发视频教程( android解析json数据 )4集集合

    老罗Android开发视频教程( android解析json数据 )4集集合 老罗Android开发视频教程( android解析json数据 ) 第一集android解析json数据 http:// ...

  2. 老罗android开发视频教程 下载地址

    感觉老罗android开发视频教程讲得挺好挺全面的,适合新手学习.分享 老罗android开发视频教程 下载地址: 电驴:http://www.verycd.com/topics/2929580/ 老 ...

  3. android运行时ART加载OAT文件解析

    在前面一文中,我们介绍了Android运行时ART,它的核心是OAT文件.OAT文件是一种Android私有ELF文件格式,它不仅包含有从DEX文件翻译而来的本地机器指令,还包含有原来的DEX文件内容 ...

  4. Android开发入门二之AndroidManfest.xml文件详细说明 .

    打开AndroidManfest.xml文件,代码如图,intent filter,描述了Activity启动的位置和时间.每当一个Activity要执行一个操作时,他将创建出一个Intent对象,这 ...

  5. 老罗Android开发视频教程录制计划

    录制视频的规划 1. android入门介绍9集--录制完成 2. 百度地图开发10集-- 录制完成 3. 常用UI的布局5集--已经更新到第二集 4. 常用UI控件32集 5. 菜单5集 6. 提示 ...

  6. 老罗android版本,锤子手机T1将死守安卓4.4系统 罗永浩称升级高版本没啥用

    在前不久,锤子手机正式推出了锤子手机2代,同时罗永浩表示,此前推出的坚果手机也将很快升级基于Android5.1版本系统的内核.不少购买锤子1代手机的用户非常关系,此次升级系统版本更新T1是否也在内, ...

  7. 老罗android开发视频第二季,安卓之父公布Essential新机,罗永浩直言视频与游戏性能不行...

    原标题:安卓之父公布Essential新机,罗永浩直言视频与游戏性能不行 安卓之父安迪·鲁宾在推特上晒出了Essential新机,这是继Essential Phone之后安卓之父打造的第二款手机. 据 ...

  8. android cm 老罗,Android之父打造了一款全面屏旗舰 罗永浩如此评价

    异形全面屏手机并不是苹果的专利,此前安卓之父Andy Rubin领导并打造的Essential Phone PH-1就是一款异形全面屏手机. Essential Phone正面采用了异形切割的全面屏, ...

  9. 《老罗的Android之旅》专栏目录

    Android学习启动篇 在Ubuntu上下载.编译和安装Android最新源代码 在Ubuntu上下载.编译和安装Android最新内核源代码(Linux Kernel) 如何单独编译Android ...

最新文章

  1. 十大Intellij IDEA快捷键转
  2. 中国是全球AI停车最大市场
  3. tomcat架构之-----基本概念
  4. 什么是光纤的波长?看看有哪些是你不知道的!
  5. SwiftUI之深入解析如何定制视图的动画和转场
  6. Jbox帮助文档,默认的属性含义
  7. Servlet_体系结构
  8. 在C#代码中执行BCS外部内容类型方法
  9. JAVA对象JSON数据互相转换的四种常见情况
  10. jQuery基础(3)- ajax
  11. 如何更改webstrom的默认端口63342
  12. C#:Access数据库的连接、读取,字段的增加、删除、更新、查询操作
  13. amos调节变量怎么画_AMOS结构方程教程,SPSS调节效应分析操作与结果的详细解读...
  14. 大地坐标系与经纬度转换(一):大地坐标系简介
  15. 创强教师办公用计算机配备要求,教师办公室电脑使用与管理有哪些规定
  16. 华为云centOS8部署
  17. nginx配置https
  18. GNU 和 UNIX 命令
  19. 阿里云智能文字转语音源码
  20. “开心网”上出现网络中奖诈骗,提醒网友提防骗局

热门文章

  1. 对于计算机网络的整体框架的概括(转载)
  2. 光纤收发器不同品牌之间的兼容性互通
  3. 【渝粤教育】国家开放大学2018年秋季 1306T社会政策 参考试题
  4. 【渝粤教育】 国家开放大学2020年春季 1373特殊教育概论 参考试题
  5. [渝粤教育] 西南科技大学 英语口语 在线考试复习资料
  6. 低功耗/远距离lora模块:物联网智能家居、抄表多领域应用SX1262芯片方案
  7. Wi-Fi和WLAN有什么区别
  8. add a legend to a boxplot in MATLAB
  9. 移动办公计算机,最适合移动办公的三款掌上电脑点评
  10. element手机验证格式_基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)...