| 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_arm.h" | 5 #include "courgette/disassembler_elf_32_arm.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 378 | 378 |
| 379 // Find the rel32 relocations. | 379 // Find the rel32 relocations. |
| 380 const uint8* p = start_pointer; | 380 const uint8* p = start_pointer; |
| 381 bool on_32bit = 1; // 32-bit ARM ops appear on 32-bit boundaries, so track it | 381 bool on_32bit = 1; // 32-bit ARM ops appear on 32-bit boundaries, so track it |
| 382 while (p < end_pointer) { | 382 while (p < end_pointer) { |
| 383 // Heuristic discovery of rel32 locations in instruction stream: are the | 383 // Heuristic discovery of rel32 locations in instruction stream: are the |
| 384 // next few bytes the start of an instruction containing a rel32 | 384 // next few bytes the start of an instruction containing a rel32 |
| 385 // addressing mode? | 385 // addressing mode? |
| 386 | 386 |
| 387 TypedRVAARM* rel32_rva = NULL; | 387 TypedRVAARM* rel32_rva = NULL; |
| 388 RVA target_rva; | 388 RVA target_rva = 0; |
| 389 bool found = false; | 389 bool found = false; |
| 390 | 390 |
| 391 // 16-bit thumb ops | 391 // 16-bit thumb ops |
| 392 if (!found && (p + 3) <= end_pointer) { | 392 if (!found && (p + 3) <= end_pointer) { |
| 393 uint16 pval = Read16LittleEndian(p); | 393 uint16 pval = Read16LittleEndian(p); |
| 394 if ((pval & 0xF000) == 0xD000) { | 394 if ((pval & 0xF000) == 0xD000) { |
| 395 RVA rva = static_cast<RVA>(p - adjust_pointer_to_rva); | 395 RVA rva = static_cast<RVA>(p - adjust_pointer_to_rva); |
| 396 | 396 |
| 397 rel32_rva = new TypedRVAARM(ARM_OFF8, rva); | 397 rel32_rva = new TypedRVAARM(ARM_OFF8, rva); |
| 398 if (!rel32_rva->ComputeRelativeTarget((uint8*) p)) { | 398 if (!rel32_rva->ComputeRelativeTarget((uint8*) p)) { |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 479 // Move 2 bytes at a time, but track 32-bit boundaries | 479 // Move 2 bytes at a time, but track 32-bit boundaries |
| 480 p += 2; | 480 p += 2; |
| 481 on_32bit = ((on_32bit + 1) % 2) != 0; | 481 on_32bit = ((on_32bit + 1) % 2) != 0; |
| 482 } | 482 } |
| 483 } | 483 } |
| 484 | 484 |
| 485 return true; | 485 return true; |
| 486 } | 486 } |
| 487 | 487 |
| 488 } // namespace courgette | 488 } // namespace courgette |
| OLD | NEW |