# HG changeset patch # User Michael Spacefalcon # Date 1396507359 0 # Node ID ca8e4328883642dabc4d5843d01ea947f962a406 # Parent d97fbe98600b840bf067fb0d9bb158232dea2564 tiobjd: ARM_B reloc handling diff -r d97fbe98600b -r ca8e43288836 ticoff/armdis.c --- a/ticoff/armdis.c Thu Apr 03 06:20:06 2014 +0000 +++ b/ticoff/armdis.c Thu Apr 03 06:42:39 2014 +0000 @@ -497,3 +497,26 @@ return; } } + +void +arm_branch_reloc(sec, rel) + struct internal_scnhdr *sec; + struct internal_reloc *rel; +{ + unsigned word, dest; + + word = get_u32(filemap + sec->data_offset + rel->location); + printf("%08x R\t", word); + if ((word & 0x0E000000) != 0x0A000000) { + printf("\n"); + return; + } + dest = (word & 0x00FFFFFF) << 2; + if (dest & 0x02000000) + dest |= 0xFC000000; + dest += rel->location + 8; + printf("b%s%s\t", word&0x1000000 ? "l" : "", + condition_decode[word>>28]); + disasm_reloc_target(sec, rel, dest); + putchar('\n'); +} diff -r d97fbe98600b -r ca8e43288836 ticoff/disasm.c --- a/ticoff/disasm.c Thu Apr 03 06:20:06 2014 +0000 +++ b/ticoff/disasm.c Thu Apr 03 06:42:39 2014 +0000 @@ -121,8 +121,14 @@ printf("MISALIGNED pos in CODE32 state, aborting\n"); return; } - /* reloc handling to be added */ - arm_disasm_line(sec, pos); + if (rel) { + if (rel->type != RTYPE_ARM_B) { + printf("Wrong reloc type in CODE32 state, aborting\n"); + return; + } + arm_branch_reloc(sec, rel); + } else + arm_disasm_line(sec, pos); incr = 4; break; case 1: /* Thumb */