| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef COURGETTE_DISASSEMBLER_H_ | 5 #ifndef COURGETTE_DISASSEMBLER_H_ |
| 6 #define COURGETTE_DISASSEMBLER_H_ | 6 #define COURGETTE_DISASSEMBLER_H_ |
| 7 | 7 |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <memory> | 10 #include <memory> |
| 11 #include <vector> | 11 #include <vector> |
| 12 | 12 |
| 13 #include "base/macros.h" | 13 #include "base/macros.h" |
| 14 #include "courgette/courgette.h" | 14 #include "courgette/courgette.h" |
| 15 #include "courgette/image_utils.h" | 15 #include "courgette/image_utils.h" |
| 16 #include "courgette/instruction_utils.h" | 16 #include "courgette/instruction_utils.h" |
| 17 | 17 |
| 18 namespace courgette { | 18 namespace courgette { |
| 19 | 19 |
| 20 class AssemblyProgram; | 20 class AssemblyProgram; |
| 21 class EncodedProgram; |
| 21 | 22 |
| 22 class Disassembler : public AddressTranslator { | 23 class Disassembler : public AddressTranslator { |
| 23 public: | 24 public: |
| 24 // Visitor/adaptor to translate RVA to target RVA for abs32. | 25 // Visitor/adaptor to translate RVA to target RVA for abs32. |
| 25 class RvaVisitor_Abs32 : public VectorRvaVisitor<RVA> { | 26 class RvaVisitor_Abs32 : public VectorRvaVisitor<RVA> { |
| 26 public: | 27 public: |
| 27 RvaVisitor_Abs32(const std::vector<RVA>& rva_locations, | 28 RvaVisitor_Abs32(const std::vector<RVA>& rva_locations, |
| 28 const AddressTranslator& translator); | 29 const AddressTranslator& translator); |
| 29 ~RvaVisitor_Abs32() override { } | 30 ~RvaVisitor_Abs32() override { } |
| 30 | 31 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 // because we may remove rel32 Labels along the way. As a result the matching | 85 // because we may remove rel32 Labels along the way. As a result the matching |
| 85 // rel32 addresses become unused. Removing them saves space. | 86 // rel32 addresses become unused. Removing them saves space. |
| 86 virtual void RemoveUnusedRel32Locations(AssemblyProgram* program) = 0; | 87 virtual void RemoveUnusedRel32Locations(AssemblyProgram* program) = 0; |
| 87 | 88 |
| 88 // Extracts structural data from the main image. Returns true if the image | 89 // Extracts structural data from the main image. Returns true if the image |
| 89 // appears to be a valid executable of the expected type, or false otherwise. | 90 // appears to be a valid executable of the expected type, or false otherwise. |
| 90 // This needs to be called before Disassemble(). | 91 // This needs to be called before Disassemble(). |
| 91 virtual bool ParseHeader() = 0; | 92 virtual bool ParseHeader() = 0; |
| 92 | 93 |
| 93 // Extracts and stores references from the main image. Returns a new | 94 // Extracts and stores references from the main image. Returns a new |
| 94 // AssemblyProgram initialized using data parsed from the main image and | 95 // AssemblyProgram with initialized Labels, or null on failure. |
| 95 // |annotate_labels|, or null on failure. | 96 std::unique_ptr<AssemblyProgram> CreateProgram(bool annotate); |
| 96 std::unique_ptr<AssemblyProgram> Disassemble(bool annotate_labels); | 97 |
| 98 // Goes through the entire program (with the help of |program|), computes all |
| 99 // instructions, and stores them into |encoded|. |
| 100 Status DisassembleAndEncode(AssemblyProgram* program, |
| 101 EncodedProgram* encoded); |
| 97 | 102 |
| 98 // ok() may always be called but returns true only after ParseHeader() | 103 // ok() may always be called but returns true only after ParseHeader() |
| 99 // succeeds. | 104 // succeeds. |
| 100 bool ok() const { return failure_reason_ == nullptr; } | 105 bool ok() const { return failure_reason_ == nullptr; } |
| 101 | 106 |
| 102 // Returns the length of the image. May reduce after ParseHeader(). | 107 // Returns the length of the image. May reduce after ParseHeader(). |
| 103 size_t length() const { return length_; } | 108 size_t length() const { return length_; } |
| 104 const uint8_t* start() const { return start_; } | 109 const uint8_t* start() const { return start_; } |
| 105 const uint8_t* end() const { return end_; } | 110 const uint8_t* end() const { return end_; } |
| 106 | 111 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 size_t length_; // In current memory. | 143 size_t length_; // In current memory. |
| 139 const uint8_t* start_; // In current memory, base for 'file offsets'. | 144 const uint8_t* start_; // In current memory, base for 'file offsets'. |
| 140 const uint8_t* end_; // In current memory. | 145 const uint8_t* end_; // In current memory. |
| 141 | 146 |
| 142 DISALLOW_COPY_AND_ASSIGN(Disassembler); | 147 DISALLOW_COPY_AND_ASSIGN(Disassembler); |
| 143 }; | 148 }; |
| 144 | 149 |
| 145 } // namespace courgette | 150 } // namespace courgette |
| 146 | 151 |
| 147 #endif // COURGETTE_DISASSEMBLER_H_ | 152 #endif // COURGETTE_DISASSEMBLER_H_ |
| OLD | NEW |