| Index: courgette/disassembler_elf_32.h
|
| diff --git a/courgette/disassembler_elf_32.h b/courgette/disassembler_elf_32.h
|
| index cf3e900f0df22576998457a4be01e9d1eefe68e4..6bcf1b888b80cd80f3529a3f3900d3f405bee630 100644
|
| --- a/courgette/disassembler_elf_32.h
|
| +++ b/courgette/disassembler_elf_32.h
|
| @@ -9,6 +9,7 @@
|
| #include <stdint.h>
|
|
|
| #include <memory>
|
| +#include <string>
|
| #include <vector>
|
|
|
| #include "base/macros.h"
|
| @@ -51,9 +52,9 @@ class DisassemblerElf32 : public Disassembler {
|
| // Computes the relative jump's offset from the op in p.
|
| virtual CheckBool ComputeRelativeTarget(const uint8_t* op_pointer) = 0;
|
|
|
| - // Emits the courgette instruction corresponding to the RVA type.
|
| + // Emits the assembly instruction corresponding to |label|.
|
| virtual CheckBool EmitInstruction(AssemblyProgram* program,
|
| - RVA target_rva) = 0;
|
| + Label* label) = 0;
|
|
|
| // Returns the size of the instruction containing the RVA.
|
| virtual uint16_t op_size() const = 0;
|
| @@ -76,6 +77,22 @@ class DisassemblerElf32 : public Disassembler {
|
| FileOffset file_offset_ = kNoFileOffset;
|
| };
|
|
|
| + // Visitor/adaptor to translate RVA to target RVA. This is the ELF
|
| + // counterpart to RvaVisitor_Rel32 that uses TypedRVA.
|
| + class Elf32RvaVisitor_Rel32 :
|
| + public VectorRvaVisitor<std::unique_ptr<TypedRVA>> {
|
| + public:
|
| + Elf32RvaVisitor_Rel32(
|
| + const std::vector<std::unique_ptr<TypedRVA>>& rva_locations);
|
| + ~Elf32RvaVisitor_Rel32() override { }
|
| +
|
| + // VectorRvaVisitor<TypedRVA*> interfaces.
|
| + RVA Get() const override;
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(Elf32RvaVisitor_Rel32);
|
| + };
|
| +
|
| public:
|
| DisassemblerElf32(const void* start, size_t length);
|
|
|
| @@ -91,6 +108,12 @@ class DisassemblerElf32 : public Disassembler {
|
|
|
| virtual e_machine_values ElfEM() const = 0;
|
|
|
| + CheckBool IsValidTargetRVA(RVA rva) const WARN_UNUSED_RESULT;
|
| +
|
| + // Converts an ELF relocation instruction into an RVA.
|
| + virtual CheckBool RelToRVA(Elf32_Rel rel, RVA* result)
|
| + const WARN_UNUSED_RESULT = 0;
|
| +
|
| // Public for unittests only
|
| std::vector<RVA>& Abs32Locations() { return abs32_locations_; }
|
| std::vector<std::unique_ptr<TypedRVA>>& Rel32Locations() {
|
| @@ -132,12 +155,6 @@ class DisassemblerElf32 : public Disassembler {
|
|
|
| // Misc address space helpers
|
|
|
| - CheckBool IsValidTargetRVA(RVA rva) const WARN_UNUSED_RESULT;
|
| -
|
| - // Converts an ELF relocation instruction into an RVA.
|
| - virtual CheckBool RelToRVA(Elf32_Rel rel, RVA* result)
|
| - const WARN_UNUSED_RESULT = 0;
|
| -
|
| CheckBool RVAsToFileOffsets(const std::vector<RVA>& rvas,
|
| std::vector<FileOffset>* file_offsets);
|
|
|
| @@ -153,6 +170,11 @@ class DisassemblerElf32 : public Disassembler {
|
| virtual CheckBool ParseRel32RelocsFromSection(const Elf32_Shdr* section)
|
| WARN_UNUSED_RESULT = 0;
|
|
|
| + // Disassembler interfaces.
|
| + RvaVisitor* CreateAbs32TargetRvaVisitor() override;
|
| + RvaVisitor* CreateRel32TargetRvaVisitor() override;
|
| + void RemoveUnusedRel32Locations(AssemblyProgram* program) override;
|
| +
|
| CheckBool ParseFile(AssemblyProgram* target) WARN_UNUSED_RESULT;
|
|
|
| CheckBool ParseProgbitsSection(
|
|
|