2018-11-25

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;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容