aboutsummaryrefslogtreecommitdiff
path: root/disassembler_elf.cc
diff options
context:
space:
mode:
authorEtienne Pierre-doray <etiennep@chromium.org>2018-10-05 20:15:13 +0000
committerCopybara-Service <copybara-worker@google.com>2021-07-25 20:38:15 -0700
commite53806a25b988acd67fe57b42eaa611f2ba96a75 (patch)
treee5782ba2d6d7b9962d783b0740f97d4492865a28 /disassembler_elf.cc
parent6b37e0db57c48727d81069bc6c0346f0ad688ec0 (diff)
downloadzucchini-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.cc59
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) {