Index: courgette/disassembler_elf_32.cc |
diff --git a/courgette/disassembler_elf_32.cc b/courgette/disassembler_elf_32.cc |
index febcdeabef504e2c540c9d65dde763fbb093b776..a6cb16fab8a5a6a558a47d9c663c23a4329749fe 100644 |
--- a/courgette/disassembler_elf_32.cc |
+++ b/courgette/disassembler_elf_32.cc |
@@ -43,14 +43,13 @@ RVA DisassemblerElf32::Elf32RvaVisitor_Rel32::Get() const { |
return (*it_)->rva() + (*it_)->relative_target(); |
} |
-DisassemblerElf32::DisassemblerElf32(const void* start, size_t length) |
+DisassemblerElf32::DisassemblerElf32(const uint8_t* start, size_t length) |
: Disassembler(start, length), |
header_(nullptr), |
section_header_table_size_(0), |
program_header_table_(nullptr), |
program_header_table_size_(0), |
- default_string_section_(nullptr) { |
-} |
+ default_string_section_(nullptr) {} |
RVA DisassemblerElf32::FileOffsetToRVA(FileOffset offset) const { |
// File offsets can be 64-bit values, but we are dealing with 32-bit |
@@ -216,6 +215,32 @@ CheckBool DisassemblerElf32::IsValidTargetRVA(RVA rva) const { |
return false; |
} |
+// static |
+bool DisassemblerElf32::QuickDetect(const uint8_t* start, |
+ size_t length, |
+ e_machine_values elf_em) { |
+ if (length < sizeof(Elf32_Ehdr)) |
+ return false; |
+ |
+ const Elf32_Ehdr* header = reinterpret_cast<const Elf32_Ehdr*>(start); |
+ |
+ // Have magic for ELF header? |
+ if (header->e_ident[0] != 0x7f || header->e_ident[1] != 'E' || |
+ header->e_ident[2] != 'L' || header->e_ident[3] != 'F') |
+ return false; |
+ |
+ if (header->e_type != ET_EXEC && header->e_type != ET_DYN) |
+ return false; |
+ if (header->e_machine != elf_em) |
+ return false; |
+ if (header->e_version != 1) |
+ return false; |
+ if (header->e_shentsize != sizeof(Elf32_Shdr)) |
+ return false; |
+ |
+ return true; |
+} |
+ |
bool DisassemblerElf32::UpdateLength() { |
Elf32_Off result = 0; |