#define D_PLT0 (D_NONE+43) // R_ARM_PLT32, 1st inst: add ip, pc, #0xNN00000
#define D_PLT1 (D_NONE+44) // R_ARM_PLT32, 2nd inst: add ip, ip, #0xNN000
#define D_PLT2 (D_NONE+45) // R_ARM_PLT32, 3rd inst: ldr pc, [ip, #0xNNN]!
-#define D_PLT32 (D_NONE+46) // R_ARM_PLT32, bl xxxxx
-#define D_CALL (D_NONE+47) // R_ARM_CALL, bl xxxxx
+#define D_CALL (D_NONE+46) // R_ARM_PLT32/R_ARM_CALL/R_ARM_JUMP24, bl xxxxx or b yyyyy
/*
* this is the ranlib header
// Handle relocations found in ELF object files.
case 256 + R_ARM_PLT32:
- r->type = D_PLT32;
+ r->type = D_CALL;
if(targ->dynimpname != nil && !targ->dynexport) {
addpltsym(targ);
r->sym = lookup(".plt", 0);
case 256 + R_ARM_CALL:
r->type = D_CALL;
- r->add += 0;
+ if(targ->dynimpname != nil && !targ->dynexport) {
+ addpltsym(targ);
+ r->sym = lookup(".plt", 0);
+ r->add = braddoff(r->add, targ->plt / 4);
+ }
return;
case 256 + R_ARM_REL32: // R_ARM_REL32
}
r->sym = S;
return;
+
+ case 256 + R_ARM_PC24:
+ case 256 + R_ARM_JUMP24:
+ r->type = D_CALL;
+ if(targ->dynimpname != nil && !targ->dynexport) {
+ addpltsym(targ);
+ r->sym = lookup(".plt", 0);
+ r->add = braddoff(r->add, targ->plt / 4);
+ }
+ return;
}
// Handle references to ELF symbols from our own object files.
*val = 0xe5bcf000U +
(0xfff & (uint32)(symaddr(r->sym) - (symaddr(lookup(".plt", 0)) + r->off) + r->add + 8));
return 0;
- case D_PLT32: // bl XXXXXX or b YYYYYY in R_ARM_PLT32
- *val = (0xff000000U & (uint32)r->add) +
- (0xffffff & (uint32)((symaddr(r->sym) + (0xffffffU & (uint32)r->add) * 4) - (s->value + r->off)) / 4);
- return 0;
- case D_CALL: // bl XXXXXX
- *val = braddoff(0xeb000000U, (0xffffff & (uint32)((symaddr(r->sym) + ((uint32)r->add) * 4 - (s->value + r->off)) / 4)));
- return 0;
- }
- return -1;
+ case D_CALL: // bl XXXXXX or b YYYYYY
+ *val = braddoff((0xff000000U & (uint32)r->add),
+ (0xffffff & (uint32)
+ ((symaddr(r->sym) + ((uint32)r->add) * 4 - (s->value + r->off)) / 4)));
+ return 0;
+}
+return -1;
}
static Reloc *
addpltreloc(Sym *plt, Sym *got, Sym *sym, int typ)
{
- Reloc *r;
+Reloc *r;
r = addrel(plt);
r->sym = got;
r->off = plt->size;
#define R_ARM_GOT32 26 /* Add PC-relative GOT offset. */
#define R_ARM_PLT32 27 /* Add PC-relative PLT offset. */
#define R_ARM_CALL 28
+#define R_ARM_JUMP24 29
#define R_ARM_V4BX 40
#define R_ARM_GOT_PREL 96
#define R_ARM_GNU_VTENTRY 100
#define R_ARM_RPC24 254
#define R_ARM_RBASE 255
-#define R_ARM_COUNT 33 /* Count of defined relocation types. */
+#define R_ARM_COUNT 37 /* Count of defined relocation types. */
#define R_386_NONE 0 /* No relocation. */
case R('5', R_ARM_CALL):
case R('5', R_ARM_V4BX):
case R('5', R_ARM_GOT_PREL):
+ case R('5', R_ARM_PC24):
+ case R('5', R_ARM_JUMP24):
case R('6', R_X86_64_PC32):
case R('6', R_X86_64_PLT32):
case R('6', R_X86_64_GOTPCREL):