From e53806a25b988acd67fe57b42eaa611f2ba96a75 Mon Sep 17 00:00:00 2001 From: Etienne Pierre-doray Date: Fri, 5 Oct 2018 20:15:13 +0000 Subject: [Zucchini]: Fix discrepancy in reference width for Elf reloc and abs32. Adds kVAWidth to Elf32Traits and use it in DisassemblerElfIntel::MakeReferenceGroups as the width of kReloc and kAbs32 reference types. Bug: 892359 Change-Id: I28930b8978393c16ee29051c48496e4f696a3fcd Reviewed-on: https://chromium-review.googlesource.com/c/1264816 Commit-Queue: Etienne Pierre-Doray Reviewed-by: Samuel Huang Cr-Commit-Position: refs/heads/master@{#597264} NOKEYCHECK=True GitOrigin-RevId: af95efbfe9d3f3ca90c105f7d1c9c13e43fcde8c --- disassembler_elf.cc | 59 ++++++++++++++++++++++++++++------------------------- 1 file changed, 31 insertions(+), 28 deletions(-) (limited to 'disassembler_elf.cc') diff --git a/disassembler_elf.cc b/disassembler_elf.cc index 8107987..0f6d3a0 100644 --- a/disassembler_elf.cc +++ b/disassembler_elf.cc @@ -153,23 +153,6 @@ std::unique_ptr DisassemblerElf::MakeWriteRelocs( return std::make_unique(image, Traits::kBitness, translator_); } -template -std::unique_ptr DisassemblerElf::MakeReadAbs32( - offset_t lo, - offset_t hi) { - Abs32RvaExtractorWin32 abs_rva_extractor(image_, {Traits::kBitness, 0}, - abs32_locations_, lo, hi); - return std::make_unique(std::move(abs_rva_extractor), - translator_); -} - -template -std::unique_ptr DisassemblerElf::MakeWriteAbs32( - MutableBufferView image) { - return std::make_unique( - image, AbsoluteAddress(Traits::kBitness, 0), translator_); -} - template bool DisassemblerElf::ParseHeader() { BufferSource source(image_); @@ -303,7 +286,7 @@ void DisassemblerElf::ExtractInterestingSectionHeaders() { template void DisassemblerElf::GetAbs32FromRelocSections() { - constexpr int kAbs32Width = 4; + constexpr int kAbs32Width = Traits::kVAWidth; DCHECK(abs32_locations_.empty()); auto relocs = MakeReadRelocs(0, offset_t(size())); for (auto ref = relocs->GetNext(); ref; ref = relocs->GetNext()) { @@ -317,7 +300,7 @@ void DisassemblerElf::GetAbs32FromRelocSections() { // Abs32 reference bodies must not overlap. If found, simply remove them. size_t num_removed = - RemoveOverlappingAbs32Locations(Traits::kBitness, &abs32_locations_); + RemoveOverlappingAbs32Locations(kAbs32Width, &abs32_locations_); if (num_removed) { LOG(WARNING) << "Warning: Found and removed " << num_removed << " abs32 locations with overlapping bodies."; @@ -349,15 +332,17 @@ DisassemblerElfIntel::~DisassemblerElfIntel() = default; template std::vector DisassemblerElfIntel::MakeReferenceGroups() const { - return {{ReferenceTypeTraits{4, TypeTag(kReloc), PoolTag(kReloc)}, - &DisassemblerElfIntel::MakeReadRelocs, - &DisassemblerElfIntel::MakeWriteRelocs}, - {ReferenceTypeTraits{4, TypeTag(kAbs32), PoolTag(kAbs32)}, - &DisassemblerElfIntel::MakeReadAbs32, - &DisassemblerElfIntel::MakeWriteAbs32}, - {ReferenceTypeTraits{4, TypeTag(kRel32), PoolTag(kRel32)}, - &DisassemblerElfIntel::MakeReadRel32, - &DisassemblerElfIntel::MakeWriteRel32}}; + return { + {ReferenceTypeTraits{sizeof(Traits::Elf_Rel::r_offset), TypeTag(kReloc), + PoolTag(kReloc)}, + &DisassemblerElfIntel::MakeReadRelocs, + &DisassemblerElfIntel::MakeWriteRelocs}, + {ReferenceTypeTraits{Traits::kVAWidth, TypeTag(kAbs32), PoolTag(kAbs32)}, + &DisassemblerElfIntel::MakeReadAbs32, + &DisassemblerElfIntel::MakeWriteAbs32}, + {ReferenceTypeTraits{4, TypeTag(kRel32), PoolTag(kRel32)}, + &DisassemblerElfIntel::MakeReadRel32, + &DisassemblerElfIntel::MakeWriteRel32}}; } template @@ -403,6 +388,24 @@ void DisassemblerElfIntel::PostProcessRel32() { std::sort(rel32_locations_.begin(), rel32_locations_.end()); } +template +std::unique_ptr DisassemblerElfIntel::MakeReadAbs32( + offset_t lo, + offset_t hi) { + Abs32RvaExtractorWin32 abs_rva_extractor(this->image_, + AbsoluteAddress(Traits::kBitness, 0), + this->abs32_locations_, lo, hi); + return std::make_unique(std::move(abs_rva_extractor), + this->translator_); +} + +template +std::unique_ptr DisassemblerElfIntel::MakeWriteAbs32( + MutableBufferView image) { + return std::make_unique( + image, AbsoluteAddress(Traits::kBitness, 0), this->translator_); +} + template std::unique_ptr DisassemblerElfIntel::MakeReadRel32( offset_t lo, -- cgit v1.2.3