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 #include "courgette/disassembler_elf_32.h" | 5 #include "courgette/disassembler_elf_32.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
398 } | 398 } |
399 | 399 |
400 // Rest of the section (if any) | 400 // Rest of the section (if any) |
401 return ParseSimpleRegion(file_offset, section_end, program); | 401 return ParseSimpleRegion(file_offset, section_end, program); |
402 } | 402 } |
403 | 403 |
404 CheckBool DisassemblerElf32::ParseSimpleRegion( | 404 CheckBool DisassemblerElf32::ParseSimpleRegion( |
405 size_t start_file_offset, | 405 size_t start_file_offset, |
406 size_t end_file_offset, | 406 size_t end_file_offset, |
407 AssemblyProgram* program) { | 407 AssemblyProgram* program) { |
| 408 // Callers don't guarantee start < end |
| 409 if (start_file_offset >= end_file_offset) return true; |
408 | 410 |
409 const uint8* start = OffsetToPointer(start_file_offset); | 411 const size_t len = end_file_offset - start_file_offset; |
410 const uint8* end = OffsetToPointer(end_file_offset); | |
411 | 412 |
412 // Callers don't guarantee start < end | 413 if (!program->EmitBytesInstruction(OffsetToPointer(start_file_offset), len)) |
413 if (start >= end) return true; | |
414 | |
415 const ptrdiff_t len = end - start; // Works because vars are byte pointers | |
416 | |
417 if (!program->EmitBytesInstruction(start, len)) | |
418 return false; | 414 return false; |
419 | 415 |
420 return true; | 416 return true; |
421 } | 417 } |
422 | 418 |
423 CheckBool DisassemblerElf32::ParseAbs32Relocs() { | 419 CheckBool DisassemblerElf32::ParseAbs32Relocs() { |
424 abs32_locations_.clear(); | 420 abs32_locations_.clear(); |
425 | 421 |
426 // Loop through sections for relocation sections | 422 // Loop through sections for relocation sections |
427 for (int section_id = 0; section_id < SectionHeaderCount(); section_id++) { | 423 for (int section_id = 0; section_id < SectionHeaderCount(); section_id++) { |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
497 return false; | 493 return false; |
498 } | 494 } |
499 | 495 |
500 std::sort(rel32_locations_.begin(), | 496 std::sort(rel32_locations_.begin(), |
501 rel32_locations_.end(), | 497 rel32_locations_.end(), |
502 TypedRVA::IsLessThan); | 498 TypedRVA::IsLessThan); |
503 return true; | 499 return true; |
504 } | 500 } |
505 | 501 |
506 } // namespace courgette | 502 } // namespace courgette |
OLD | NEW |