Skip to content

Commit

Permalink
pseudo-reloc: implement ARM 24-bit relocations
Browse files Browse the repository at this point in the history
  • Loading branch information
MaxKellermann committed Oct 25, 2016
1 parent ffa5b6e commit cd5f3e6
Showing 1 changed file with 24 additions and 0 deletions.
24 changes: 24 additions & 0 deletions pseudo-reloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,9 @@ __write_memory (void *addr, const void *src, size_t len)
static void
do_pseudo_reloc (void * start, void * end, void * base)
{
#ifdef UNDER_CE
unsigned opcode;
#endif
ptrdiff_t addr_imp, reldata;
ptrdiff_t reloc_target = (ptrdiff_t) ((char *)end - (char*)start);
runtime_pseudo_reloc_v2 *v2_hdr = (runtime_pseudo_reloc_v2 *) start;
Expand Down Expand Up @@ -312,6 +315,13 @@ do_pseudo_reloc (void * start, void * end, void * base)
if ((reldata & 0x8000) != 0)
reldata |= ~((ptrdiff_t) 0xffff);
break;
#ifdef UNDER_CE
case 24:
opcode = *(unsigned *)reloc_target;
reldata = (ptrdiff_t) ((opcode & 0xffffff) << 2);
opcode &= ~0xffffff;
break;
#endif
case 32:
reldata = (ptrdiff_t) (*((unsigned int *)reloc_target));
#ifdef _WIN64
Expand Down Expand Up @@ -344,6 +354,20 @@ do_pseudo_reloc (void * start, void * end, void * base)
case 16:
__write_memory ((void *) reloc_target, &reldata, 2);
break;
#ifdef UNDER_CE
case 24:
if ((reldata & 0x3) != 0)
__report_error (" Misaligned 24-bit pseudo relocation to 0x%x.\n",
reldata);

if (reldata >= 0x1ffffff || reldata < -0x1ffffff)
__report_error (" Pseudo relocation (0x%x) does not fit in 24 bit target.\n",
reldata);

reldata = opcode | ((reldata >> 2) & 0xffffff);
__write_memory ((void *) reloc_target, &reldata, 4);
break;
#endif
case 32:
__write_memory ((void *) reloc_target, &reldata, 4);
break;
Expand Down

0 comments on commit cd5f3e6

Please sign in to comment.