summaryrefslogtreecommitdiffstats
path: root/courgette/disassembler_elf_32_x86.h
diff options
context:
space:
mode:
Diffstat (limited to 'courgette/disassembler_elf_32_x86.h')
-rw-r--r--courgette/disassembler_elf_32_x86.h143
1 files changed, 143 insertions, 0 deletions
diff --git a/courgette/disassembler_elf_32_x86.h b/courgette/disassembler_elf_32_x86.h
new file mode 100644
index 0000000..c797a8b
--- /dev/null
+++ b/courgette/disassembler_elf_32_x86.h
@@ -0,0 +1,143 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COURGETTE_DISASSEMBLER_ELF_32_X86_H_
+#define COURGETTE_DISASSEMBLER_ELF_32_X86_H_
+
+#include "base/basictypes.h"
+#include "courgette/disassembler.h"
+#include "courgette/memory_allocator.h"
+#include "courgette/types_elf.h"
+
+namespace courgette {
+
+class AssemblyProgram;
+
+class DisassemblerElf32X86 : public Disassembler {
+ public:
+ explicit DisassemblerElf32X86(const void* start, size_t length);
+
+ virtual ExecutableType kind() { return EXE_ELF_32_X86; }
+
+ // Returns 'true' if the buffer appears to point to a valid ELF executable
+ // for X86 32 bitWindows 32 bit. If ParseHeader() succeeds, other member
+ // functions may be called.
+ virtual bool ParseHeader();
+
+ virtual bool Disassemble(AssemblyProgram* target);
+
+ // Public for unittests only
+ std::vector<RVA> &Abs32Locations() { return abs32_locations_; }
+ std::vector<RVA> &Rel32Locations() { return rel32_locations_; }
+
+ protected:
+
+ uint32 DiscoverLength();
+
+ // Misc Section Helpers
+
+ const Elf32_Half SectionHeaderCount() const {
+ return section_header_table_size_;
+ }
+
+ const Elf32_Shdr *SectionHeader(int id) const {
+ assert(id >= 0 && id < SectionHeaderCount());
+ return section_header_table_ + id;
+ }
+
+ const uint8 *SectionBody(int id) const {
+ return OffsetToPointer(SectionHeader(id)->sh_offset);
+ }
+
+ const Elf32_Word SectionBodySize(int id) const {
+ return SectionHeader(id)->sh_size;
+ }
+
+ // Misc Segment Helpers
+
+ const Elf32_Half ProgramSegmentHeaderCount() const {
+ return program_header_table_size_;
+ }
+
+ const Elf32_Phdr *ProgramSegmentHeader(int id) const {
+ assert(id >= 0 && id < ProgramSegmentHeaderCount());
+ return program_header_table_ + id;
+ }
+
+ // The virtual memory address at which this program segment will be loaded
+ const Elf32_Addr ProgramSegmentMemoryBegin(int id) const {
+ return ProgramSegmentHeader(id)->p_vaddr;
+ }
+
+ // The number of virtual memory bytes for this program segment
+ const Elf32_Word ProgramSegmentMemorySize(int id) const {
+ return ProgramSegmentHeader(id)->p_memsz;
+ }
+
+ // Pointer into the source file for this program segment
+ const Elf32_Addr ProgramSegmentFileOffset(int id) const {
+ return ProgramSegmentHeader(id)->p_offset;
+ }
+
+ // Number of file bytes for this program segment. Is <= ProgramMemorySize.
+ const Elf32_Word ProgramSegmentFileSize(int id) const {
+ return ProgramSegmentHeader(id)->p_filesz;
+ }
+
+ // Misc address space helpers
+
+ CheckBool IsValidRVA(RVA rva) const WARN_UNUSED_RESULT;
+
+ // Convert an ELF relocation struction into an RVA
+ CheckBool RelToRVA(Elf32_Rel rel, RVA* result) const WARN_UNUSED_RESULT;
+
+ // Returns kNoOffset if there is no file offset corresponding to 'rva'.
+ CheckBool RVAToFileOffset(RVA rva, size_t* result) const WARN_UNUSED_RESULT;
+
+ RVA FileOffsetToRVA(size_t offset) const WARN_UNUSED_RESULT;
+
+ CheckBool RVAsToOffsets(std::vector<RVA>* rvas /*in*/,
+ std::vector<size_t>* offsets /*out*/);
+
+ // Parsing Code used to really implement Disassemble
+
+ CheckBool ParseFile(AssemblyProgram* target) WARN_UNUSED_RESULT;
+ CheckBool ParseRelocationSection(
+ const Elf32_Shdr *section_header,
+ AssemblyProgram* program) WARN_UNUSED_RESULT;
+ CheckBool ParseProgbitsSection(
+ const Elf32_Shdr *section_header,
+ std::vector<size_t>::iterator* current_abs_offset,
+ std::vector<size_t>::iterator end_abs_offset,
+ std::vector<size_t>::iterator* current_rel_offset,
+ std::vector<size_t>::iterator end_rel_offset,
+ AssemblyProgram* program) WARN_UNUSED_RESULT;
+ CheckBool ParseSimpleRegion(size_t start_file_offset,
+ size_t end_file_offset,
+ AssemblyProgram* program) WARN_UNUSED_RESULT;
+
+ CheckBool ParseAbs32Relocs() WARN_UNUSED_RESULT;
+ CheckBool ParseRel32RelocsFromSections() WARN_UNUSED_RESULT;
+ CheckBool ParseRel32RelocsFromSection(
+ const Elf32_Shdr* section) WARN_UNUSED_RESULT;
+
+ Elf32_Ehdr *header_;
+ Elf32_Shdr *section_header_table_;
+ Elf32_Half section_header_table_size_;
+
+ Elf32_Phdr *program_header_table_;
+ Elf32_Half program_header_table_size_;
+
+ // Section header for default
+ const char *default_string_section_;
+
+ std::vector<RVA> abs32_locations_;
+ std::vector<RVA> rel32_locations_;
+
+ DISALLOW_COPY_AND_ASSIGN(DisassemblerElf32X86);
+};
+
+} // namespace courgette
+
+#endif // COURGETTE_DISASSEMBLER_ELF_32_X86_H_