powerpc: Handle new ELFv2 module relocations
The new ELF ABI tends to use R_PPC64_REL16_LO and R_PPC64_REL16_HA relocations (PC-relative), so implement them. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
4edebbeae3
commit
0906584a0a
|
@ -295,8 +295,13 @@ do { \
|
||||||
#define R_PPC64_TLSLD 108
|
#define R_PPC64_TLSLD 108
|
||||||
#define R_PPC64_TOCSAVE 109
|
#define R_PPC64_TOCSAVE 109
|
||||||
|
|
||||||
|
#define R_PPC64_REL16 249
|
||||||
|
#define R_PPC64_REL16_LO 250
|
||||||
|
#define R_PPC64_REL16_HI 251
|
||||||
|
#define R_PPC64_REL16_HA 252
|
||||||
|
|
||||||
/* Keep this the last entry. */
|
/* Keep this the last entry. */
|
||||||
#define R_PPC64_NUM 110
|
#define R_PPC64_NUM 253
|
||||||
|
|
||||||
/* There's actually a third entry here, but it's unused */
|
/* There's actually a third entry here, but it's unused */
|
||||||
struct ppc64_opd_entry
|
struct ppc64_opd_entry
|
||||||
|
|
|
@ -491,6 +491,23 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
|
||||||
*/
|
*/
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case R_PPC64_REL16_HA:
|
||||||
|
/* Subtract location pointer */
|
||||||
|
value -= (unsigned long)location;
|
||||||
|
value = ((value + 0x8000) >> 16);
|
||||||
|
*((uint16_t *) location)
|
||||||
|
= (*((uint16_t *) location) & ~0xffff)
|
||||||
|
| (value & 0xffff);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case R_PPC64_REL16_LO:
|
||||||
|
/* Subtract location pointer */
|
||||||
|
value -= (unsigned long)location;
|
||||||
|
*((uint16_t *) location)
|
||||||
|
= (*((uint16_t *) location) & ~0xffff)
|
||||||
|
| (value & 0xffff);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
printk("%s: Unknown ADD relocation: %lu\n",
|
printk("%s: Unknown ADD relocation: %lu\n",
|
||||||
me->name,
|
me->name,
|
||||||
|
|
Loading…
Reference in New Issue