Support for R_ARM_[THM_]MOV{W,T}_ABS[_NC} relocs
Add support for relocations R_ARM_MOVW_ABS_NC and R_ARM_MOVT_ABS as well as their Thumb2 counterpart R_ARM_THM_MOVW_ABS_NC and R_ARM_THM_MOVT_ABS. These are encountered with gcc when compiling for armv7-a and a data is loaded in a register, either in arm or Thumb2 mode. The first half of the data is loaded with movw ; the second half is loaded with movt.
This commit is contained in:
parent
3d409b0889
commit
2fe7fd9e87
2 changed files with 36 additions and 0 deletions
4
elf.h
4
elf.h
|
@ -1692,6 +1692,10 @@ typedef Elf32_Addr Elf32_Conflict;
|
||||||
#define R_ARM_JUMP24 29
|
#define R_ARM_JUMP24 29
|
||||||
#define R_ARM_V4BX 40
|
#define R_ARM_V4BX 40
|
||||||
#define R_ARM_PREL31 42
|
#define R_ARM_PREL31 42
|
||||||
|
#define R_ARM_MOVW_ABS_NC 43
|
||||||
|
#define R_ARM_MOVT_ABS 44
|
||||||
|
#define R_ARM_THM_MOVW_ABS_NC 47
|
||||||
|
#define R_ARM_THM_MOVT_ABS 48
|
||||||
#define R_ARM_GNU_VTENTRY 100
|
#define R_ARM_GNU_VTENTRY 100
|
||||||
#define R_ARM_GNU_VTINHERIT 101
|
#define R_ARM_GNU_VTINHERIT 101
|
||||||
#define R_ARM_THM_PC11 102 /* thumb unconditional branch */
|
#define R_ARM_THM_PC11 102 /* thumb unconditional branch */
|
||||||
|
|
32
tccelf.c
32
tccelf.c
|
@ -620,6 +620,38 @@ ST_FUNC void relocate_section(TCCState *s1, Section *s)
|
||||||
(*(int *)ptr) |= x;
|
(*(int *)ptr) |= x;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case R_ARM_MOVT_ABS:
|
||||||
|
case R_ARM_MOVW_ABS_NC:
|
||||||
|
{
|
||||||
|
int x, imm4, imm12;
|
||||||
|
if (type == R_ARM_MOVT_ABS)
|
||||||
|
val >>= 16;
|
||||||
|
imm12 = val & 0xfff;
|
||||||
|
imm4 = (val >> 12) & 0xf;
|
||||||
|
x = (imm4 << 16) | imm12;
|
||||||
|
if (type == R_ARM_THM_MOVT_ABS)
|
||||||
|
*(int *)ptr |= x;
|
||||||
|
else
|
||||||
|
*(int *)ptr += x;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case R_ARM_THM_MOVT_ABS:
|
||||||
|
case R_ARM_THM_MOVW_ABS_NC:
|
||||||
|
{
|
||||||
|
int x, i, imm4, imm3, imm8;
|
||||||
|
if (type == R_ARM_THM_MOVT_ABS)
|
||||||
|
val >>= 16;
|
||||||
|
imm8 = val & 0xff;
|
||||||
|
imm3 = (val >> 8) & 0x7;
|
||||||
|
i = (val >> 11) & 1;
|
||||||
|
imm4 = (val >> 12) & 0xf;
|
||||||
|
x = (imm3 << 28) | (imm8 << 16) | (i << 10) | imm4;
|
||||||
|
if (type == R_ARM_THM_MOVT_ABS)
|
||||||
|
*(int *)ptr |= x;
|
||||||
|
else
|
||||||
|
*(int *)ptr += x;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case R_ARM_PREL31:
|
case R_ARM_PREL31:
|
||||||
{
|
{
|
||||||
int x;
|
int x;
|
||||||
|
|
Loading…
Reference in a new issue