Commit 0906584a authored by Rusty Russell's avatar Rusty Russell Committed by Anton Blanchard

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: default avatarRusty Russell <rusty@rustcorp.com.au>
parent 4edebbea
...@@ -295,8 +295,13 @@ do { \ ...@@ -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, ...@@ -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,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment