Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(711)

Unified Diff: courgette/disassembler_elf_32.cc

Issue 2055343002: Courgette: Add static method QuickDetect() to optimize program detection. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: sync Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « courgette/disassembler_elf_32.h ('k') | courgette/disassembler_elf_32_arm.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
« no previous file with comments | « courgette/disassembler_elf_32.h ('k') | courgette/disassembler_elf_32_arm.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698