diff options
author | Etienne Pierre-doray <etiennep@chromium.org> | 2018-10-05 20:15:13 +0000 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2021-07-25 20:38:15 -0700 |
commit | e53806a25b988acd67fe57b42eaa611f2ba96a75 (patch) | |
tree | e5782ba2d6d7b9962d783b0740f97d4492865a28 /disassembler_elf.cc | |
parent | 6b37e0db57c48727d81069bc6c0346f0ad688ec0 (diff) | |
download | zucchini-e53806a25b988acd67fe57b42eaa611f2ba96a75.tar.gz |
[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 <etiennep@chromium.org>
Reviewed-by: Samuel Huang <huangs@chromium.org>
Cr-Commit-Position: refs/heads/master@{#597264}
NOKEYCHECK=True
GitOrigin-RevId: af95efbfe9d3f3ca90c105f7d1c9c13e43fcde8c
Diffstat (limited to 'disassembler_elf.cc')
-rw-r--r-- | disassembler_elf.cc | 59 |
1 files changed, 31 insertions, 28 deletions
diff --git a/disassembler_elf.cc b/disassembler_elf.cc index 8107987..0f6d3a0 100644 --- a/disassembler_elf.cc +++ b/disassembler_elf.cc @@ -154,23 +154,6 @@ std::unique_ptr<ReferenceWriter> DisassemblerElf<Traits>::MakeWriteRelocs( } template <class Traits> -std::unique_ptr<ReferenceReader> DisassemblerElf<Traits>::MakeReadAbs32( - offset_t lo, - offset_t hi) { - Abs32RvaExtractorWin32 abs_rva_extractor(image_, {Traits::kBitness, 0}, - abs32_locations_, lo, hi); - return std::make_unique<Abs32ReaderWin32>(std::move(abs_rva_extractor), - translator_); -} - -template <class Traits> -std::unique_ptr<ReferenceWriter> DisassemblerElf<Traits>::MakeWriteAbs32( - MutableBufferView image) { - return std::make_unique<Abs32WriterWin32>( - image, AbsoluteAddress(Traits::kBitness, 0), translator_); -} - -template <class Traits> bool DisassemblerElf<Traits>::ParseHeader() { BufferSource source(image_); @@ -303,7 +286,7 @@ void DisassemblerElf<Traits>::ExtractInterestingSectionHeaders() { template <class Traits> void DisassemblerElf<Traits>::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<Traits>::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<Traits>::~DisassemblerElfIntel() = default; template <class Traits> std::vector<ReferenceGroup> DisassemblerElfIntel<Traits>::MakeReferenceGroups() const { - return {{ReferenceTypeTraits{4, TypeTag(kReloc), PoolTag(kReloc)}, - &DisassemblerElfIntel<Traits>::MakeReadRelocs, - &DisassemblerElfIntel<Traits>::MakeWriteRelocs}, - {ReferenceTypeTraits{4, TypeTag(kAbs32), PoolTag(kAbs32)}, - &DisassemblerElfIntel<Traits>::MakeReadAbs32, - &DisassemblerElfIntel<Traits>::MakeWriteAbs32}, - {ReferenceTypeTraits{4, TypeTag(kRel32), PoolTag(kRel32)}, - &DisassemblerElfIntel<Traits>::MakeReadRel32, - &DisassemblerElfIntel<Traits>::MakeWriteRel32}}; + return { + {ReferenceTypeTraits{sizeof(Traits::Elf_Rel::r_offset), TypeTag(kReloc), + PoolTag(kReloc)}, + &DisassemblerElfIntel<Traits>::MakeReadRelocs, + &DisassemblerElfIntel<Traits>::MakeWriteRelocs}, + {ReferenceTypeTraits{Traits::kVAWidth, TypeTag(kAbs32), PoolTag(kAbs32)}, + &DisassemblerElfIntel<Traits>::MakeReadAbs32, + &DisassemblerElfIntel<Traits>::MakeWriteAbs32}, + {ReferenceTypeTraits{4, TypeTag(kRel32), PoolTag(kRel32)}, + &DisassemblerElfIntel<Traits>::MakeReadRel32, + &DisassemblerElfIntel<Traits>::MakeWriteRel32}}; } template <class Traits> @@ -404,6 +389,24 @@ void DisassemblerElfIntel<Traits>::PostProcessRel32() { } template <class Traits> +std::unique_ptr<ReferenceReader> DisassemblerElfIntel<Traits>::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<Abs32ReaderWin32>(std::move(abs_rva_extractor), + this->translator_); +} + +template <class Traits> +std::unique_ptr<ReferenceWriter> DisassemblerElfIntel<Traits>::MakeWriteAbs32( + MutableBufferView image) { + return std::make_unique<Abs32WriterWin32>( + image, AbsoluteAddress(Traits::kBitness, 0), this->translator_); +} + +template <class Traits> std::unique_ptr<ReferenceReader> DisassemblerElfIntel<Traits>::MakeReadRel32( offset_t lo, offset_t hi) { |