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

Side by Side 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 unified diff | 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 »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 #include "courgette/disassembler_elf_32.h" 5 #include "courgette/disassembler_elf_32.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <iterator> 8 #include <iterator>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 25 matching lines...) Expand all
36 36
37 DisassemblerElf32::Elf32RvaVisitor_Rel32::Elf32RvaVisitor_Rel32( 37 DisassemblerElf32::Elf32RvaVisitor_Rel32::Elf32RvaVisitor_Rel32(
38 const std::vector<std::unique_ptr<TypedRVA>>& rva_locations) 38 const std::vector<std::unique_ptr<TypedRVA>>& rva_locations)
39 : VectorRvaVisitor<std::unique_ptr<TypedRVA>>(rva_locations) { 39 : VectorRvaVisitor<std::unique_ptr<TypedRVA>>(rva_locations) {
40 } 40 }
41 41
42 RVA DisassemblerElf32::Elf32RvaVisitor_Rel32::Get() const { 42 RVA DisassemblerElf32::Elf32RvaVisitor_Rel32::Get() const {
43 return (*it_)->rva() + (*it_)->relative_target(); 43 return (*it_)->rva() + (*it_)->relative_target();
44 } 44 }
45 45
46 DisassemblerElf32::DisassemblerElf32(const void* start, size_t length) 46 DisassemblerElf32::DisassemblerElf32(const uint8_t* start, size_t length)
47 : Disassembler(start, length), 47 : Disassembler(start, length),
48 header_(nullptr), 48 header_(nullptr),
49 section_header_table_size_(0), 49 section_header_table_size_(0),
50 program_header_table_(nullptr), 50 program_header_table_(nullptr),
51 program_header_table_size_(0), 51 program_header_table_size_(0),
52 default_string_section_(nullptr) { 52 default_string_section_(nullptr) {}
53 }
54 53
55 RVA DisassemblerElf32::FileOffsetToRVA(FileOffset offset) const { 54 RVA DisassemblerElf32::FileOffsetToRVA(FileOffset offset) const {
56 // File offsets can be 64-bit values, but we are dealing with 32-bit 55 // File offsets can be 64-bit values, but we are dealing with 32-bit
57 // executables and so only need to support 32-bit file sizes. 56 // executables and so only need to support 32-bit file sizes.
58 uint32_t offset32 = static_cast<uint32_t>(offset); 57 uint32_t offset32 = static_cast<uint32_t>(offset);
59 58
60 // Visit section headers ordered by file offset. 59 // Visit section headers ordered by file offset.
61 for (Elf32_Half section_id : section_header_file_offset_order_) { 60 for (Elf32_Half section_id : section_header_file_offset_order_) {
62 const Elf32_Shdr* section_header = SectionHeader(section_id); 61 const Elf32_Shdr* section_header = SectionHeader(section_id);
63 // These can appear to have a size in the file, but don't. 62 // These can appear to have a size in the file, but don't.
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 Elf32_Addr begin = segment_header->p_vaddr; 208 Elf32_Addr begin = segment_header->p_vaddr;
210 Elf32_Addr end = segment_header->p_vaddr + segment_header->p_memsz; 209 Elf32_Addr end = segment_header->p_vaddr + segment_header->p_memsz;
211 210
212 if (rva >= begin && rva < end) 211 if (rva >= begin && rva < end)
213 return true; 212 return true;
214 } 213 }
215 214
216 return false; 215 return false;
217 } 216 }
218 217
218 // static
219 bool DisassemblerElf32::QuickDetect(const uint8_t* start,
220 size_t length,
221 e_machine_values elf_em) {
222 if (length < sizeof(Elf32_Ehdr))
223 return false;
224
225 const Elf32_Ehdr* header = reinterpret_cast<const Elf32_Ehdr*>(start);
226
227 // Have magic for ELF header?
228 if (header->e_ident[0] != 0x7f || header->e_ident[1] != 'E' ||
229 header->e_ident[2] != 'L' || header->e_ident[3] != 'F')
230 return false;
231
232 if (header->e_type != ET_EXEC && header->e_type != ET_DYN)
233 return false;
234 if (header->e_machine != elf_em)
235 return false;
236 if (header->e_version != 1)
237 return false;
238 if (header->e_shentsize != sizeof(Elf32_Shdr))
239 return false;
240
241 return true;
242 }
243
219 bool DisassemblerElf32::UpdateLength() { 244 bool DisassemblerElf32::UpdateLength() {
220 Elf32_Off result = 0; 245 Elf32_Off result = 0;
221 246
222 // Find the end of the last section 247 // Find the end of the last section
223 for (Elf32_Half section_id = 0; section_id < SectionHeaderCount(); 248 for (Elf32_Half section_id = 0; section_id < SectionHeaderCount();
224 ++section_id) { 249 ++section_id) {
225 const Elf32_Shdr* section_header = SectionHeader(section_id); 250 const Elf32_Shdr* section_header = SectionHeader(section_id);
226 251
227 if (section_header->sh_type == SHT_NOBITS) 252 if (section_header->sh_type == SHT_NOBITS)
228 continue; 253 continue;
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
599 if (!ParseRel32RelocsFromSection(section_header)) 624 if (!ParseRel32RelocsFromSection(section_header))
600 return false; 625 return false;
601 } 626 }
602 if (!found_rel32) 627 if (!found_rel32)
603 VLOG(1) << "Warning: Found no rel32 addresses. Missing .text section?"; 628 VLOG(1) << "Warning: Found no rel32 addresses. Missing .text section?";
604 629
605 return true; 630 return true;
606 } 631 }
607 632
608 } // namespace courgette 633 } // namespace courgette
OLDNEW
« 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