OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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_ELF_32_ARM_H_ | 5 #ifndef COURGETTE_DISASSEMBLER_ELF_32_ARM_H_ |
6 #define COURGETTE_DISASSEMBLER_ELF_32_ARM_H_ | 6 #define COURGETTE_DISASSEMBLER_ELF_32_ARM_H_ |
7 | 7 |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 | 10 |
11 #include <map> | 11 #include <map> |
12 | 12 |
13 #include "base/macros.h" | 13 #include "base/macros.h" |
14 #include "courgette/disassembler_elf_32.h" | 14 #include "courgette/disassembler_elf_32.h" |
15 #include "courgette/types_elf.h" | 15 #include "courgette/types_elf.h" |
16 | 16 |
17 namespace courgette { | 17 namespace courgette { |
18 | 18 |
19 class AssemblyProgram; | 19 class AssemblyProgram; |
| 20 class InstructionReceptor; |
20 | 21 |
21 enum ARM_RVA { | 22 enum ARM_RVA { |
22 ARM_OFF8, | 23 ARM_OFF8, |
23 ARM_OFF11, | 24 ARM_OFF11, |
24 ARM_OFF24, | 25 ARM_OFF24, |
25 ARM_OFF25, | 26 ARM_OFF25, |
26 ARM_OFF21, | 27 ARM_OFF21, |
27 }; | 28 }; |
28 | 29 |
29 class DisassemblerElf32ARM : public DisassemblerElf32 { | 30 class DisassemblerElf32ARM : public DisassemblerElf32 { |
30 public: | 31 public: |
31 // Returns true if a valid executable is detected using only quick checks. | 32 // Returns true if a valid executable is detected using only quick checks. |
32 static bool QuickDetect(const uint8_t* start, size_t length) { | 33 static bool QuickDetect(const uint8_t* start, size_t length) { |
33 return DisassemblerElf32::QuickDetect(start, length, EM_ARM); | 34 return DisassemblerElf32::QuickDetect(start, length, EM_ARM); |
34 } | 35 } |
35 | 36 |
36 class TypedRVAARM : public TypedRVA { | 37 class TypedRVAARM : public TypedRVA { |
37 public: | 38 public: |
38 TypedRVAARM(ARM_RVA type, RVA rva) : TypedRVA(rva), type_(type) { } | 39 TypedRVAARM(ARM_RVA type, RVA rva) : TypedRVA(rva), type_(type) { } |
39 ~TypedRVAARM() override { } | 40 ~TypedRVAARM() override { } |
40 | 41 |
41 // TypedRVA interfaces. | 42 // TypedRVA interfaces. |
42 CheckBool ComputeRelativeTarget(const uint8_t* op_pointer) override; | 43 CheckBool ComputeRelativeTarget(const uint8_t* op_pointer) override; |
43 CheckBool EmitInstruction(AssemblyProgram* program, | 44 CheckBool EmitInstruction(Label* label, |
44 Label* label) override; | 45 InstructionReceptor* receptor) override; |
45 uint16_t op_size() const override; | 46 uint16_t op_size() const override; |
46 | 47 |
47 uint16_t c_op() const { return c_op_; } | 48 uint16_t c_op() const { return c_op_; } |
48 | 49 |
49 private: | 50 private: |
50 ARM_RVA type_; | 51 ARM_RVA type_; |
51 uint16_t c_op_; // Set by ComputeRelativeTarget(). | 52 uint16_t c_op_; // Set by ComputeRelativeTarget(). |
52 const uint8_t* arm_op_; | 53 const uint8_t* arm_op_; |
53 }; | 54 }; |
54 | 55 |
(...skipping 24 matching lines...) Expand all Loading... |
79 static CheckBool Decompress(ARM_RVA type, | 80 static CheckBool Decompress(ARM_RVA type, |
80 uint16_t c_op, | 81 uint16_t c_op, |
81 uint32_t addr, | 82 uint32_t addr, |
82 uint32_t* arm_op /* out */); | 83 uint32_t* arm_op /* out */); |
83 | 84 |
84 protected: | 85 protected: |
85 // DisassemblerElf32 interfaces. | 86 // DisassemblerElf32 interfaces. |
86 CheckBool RelToRVA(Elf32_Rel rel, | 87 CheckBool RelToRVA(Elf32_Rel rel, |
87 RVA* result) const override WARN_UNUSED_RESULT; | 88 RVA* result) const override WARN_UNUSED_RESULT; |
88 CheckBool ParseRelocationSection(const Elf32_Shdr* section_header, | 89 CheckBool ParseRelocationSection(const Elf32_Shdr* section_header, |
89 AssemblyProgram* program) | 90 InstructionReceptor* receptor) const override |
90 override WARN_UNUSED_RESULT; | 91 WARN_UNUSED_RESULT; |
91 CheckBool ParseRel32RelocsFromSection(const Elf32_Shdr* section) | 92 CheckBool ParseRel32RelocsFromSection(const Elf32_Shdr* section) |
92 override WARN_UNUSED_RESULT; | 93 override WARN_UNUSED_RESULT; |
93 | 94 |
94 #if COURGETTE_HISTOGRAM_TARGETS | 95 #if COURGETTE_HISTOGRAM_TARGETS |
95 std::map<RVA, int> rel32_target_rvas_; | 96 std::map<RVA, int> rel32_target_rvas_; |
96 #endif | 97 #endif |
97 | 98 |
| 99 private: |
98 DISALLOW_COPY_AND_ASSIGN(DisassemblerElf32ARM); | 100 DISALLOW_COPY_AND_ASSIGN(DisassemblerElf32ARM); |
99 }; | 101 }; |
100 | 102 |
101 } // namespace courgette | 103 } // namespace courgette |
102 | 104 |
103 #endif // COURGETTE_DISASSEMBLER_ELF_32_ARM_H_ | 105 #endif // COURGETTE_DISASSEMBLER_ELF_32_ARM_H_ |
OLD | NEW |