WriteAndOpenDexFiles-》RecordOatDataOffset
关键是找到outputstream oat_rodata是如何生成的。
在dex2oatc.cc中
rodata_.push_back(elf_writers_[i]->StartRoData());
在elf_writer_quick.cc
OutputStream* ElfWriterQuick<ElfTypes>::StartRoData() {
auto* rodata = builder_->GetRoData();
rodata->Start();
return rodata;
}
在elf_builder.h
Section* GetRoData() { return &rodata_; }
返回一个section的指针。就是说section的指针也是一种outputstream。
有调用 // Allocate all pre-dynamic sections.
rodata_.AllocateVirtualMemory(rodata_size); 方法。
// Start writing file data of this section.
void Start() {
CHECK(owner_->current_section_ == nullptr);
Elf_Word align = AddSection();
CHECK_EQ(header_.sh_offset, 0u);
header_.sh_offset = owner_->AlignFileOffset(align);
owner_->current_section_ = this;
}