Boot Image Relocation Read-Only Data Section
.data.bimg.rel.ro 是 boot.oat 文件中的一个特殊段,全称为 "Boot Image Relocation Read-Only Data"(启动镜像重定位只读数据段)。
它的核心作用是:存储 boot.oat 中所有指向 boot.art 的指针引用表, 这些指针在运行时需要根据 boot.art 的实际加载地址进行重定位(地址修正)。
编译 boot.oat 时,编译器无法预知 boot.art 在运行时会被加载到哪个虚拟地址。 每台设备、每次启动,boot.art 的加载地址可能都不同(受 ASLR - 地址空间布局随机化影响)。
假设地址
编译器使用的临时基地址
实际地址
mmap 实际分配的地址
Patch Delta = 0x70A3F000 - 0x10000000 = 0x60A3F000
所有指针都需要加上这个增量才能指向正确的地址!
boot.oat 的 .text 段(代码段)是只读可执行的(R-X), 出于安全考虑(防止代码注入攻击),运行时无法直接修改代码段中的指令。
解决方案:将所有需要重定位的指针集中存储在一个可修改的数据段中 — 这就是 .data.bimg.rel.ro。
BASE_ADDR绝对地址 = BASE_ADDR + 偏移量0x60A3F000
| 引用类型 | 描述 | 数量级 |
|---|---|---|
| Class Pointers | 指向 boot.art 中类对象的指针 | ~3,000-5,000 |
| String Pointers | 指向字符串常量池的指针 | ~20,000-40,000 |
| Static Field Pointers | 指向静态字段存储位置的指针 | ~5,000-10,000 |
| ArtMethod Pointers | 指向方法元数据的指针 | ~10,000-20,000 |
| DexCache Pointers | 指向 DEX 文件缓存的指针 | ~100-200 |
mprotect()
将 .data.bimg.rel.ro 设置为只读,防止运行时意外修改这些关键指针。这也是命名中 "ro" 的由来。
art/runtime/image.ccart/compiler/image_writer.ccart/runtime/oat_file.cc📚 深度技术解析 • 基于 Android 14 AOSP 源码