diff options
| author | Peter Bergner <bergner@vnet.ibm.com> | 2005-10-11 12:28:24 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-10-11 12:46:54 -0400 |
| commit | 9149ccfa3571eaa4a4b444777d67fc4ed3ebcf27 (patch) | |
| tree | 92d07c8a2e76abf5b5805db6deb5a90d69406b76 | |
| parent | d3089792f6ee38cdc9e254a7cb2f8c8d7f38c20d (diff) | |
[PATCH] ppc64: Add R_PPC64_TOC16 module reloc
Newer gcc's are generating this relocation, so the module loader needs to
handle it.
Signed-off-by: Peter Bergner <bergner@vnet.ibm.com>
Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
| -rw-r--r-- | arch/ppc64/kernel/module.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/arch/ppc64/kernel/module.c b/arch/ppc64/kernel/module.c index c683bf88e6..928b8581fc 100644 --- a/arch/ppc64/kernel/module.c +++ b/arch/ppc64/kernel/module.c | |||
| @@ -341,6 +341,19 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, | |||
| 341 | *(unsigned long *)location = my_r2(sechdrs, me); | 341 | *(unsigned long *)location = my_r2(sechdrs, me); |
| 342 | break; | 342 | break; |
| 343 | 343 | ||
| 344 | case R_PPC64_TOC16: | ||
| 345 | /* Subtact TOC pointer */ | ||
| 346 | value -= my_r2(sechdrs, me); | ||
| 347 | if (value + 0x8000 > 0xffff) { | ||
| 348 | printk("%s: bad TOC16 relocation (%lu)\n", | ||
| 349 | me->name, value); | ||
| 350 | return -ENOEXEC; | ||
| 351 | } | ||
| 352 | *((uint16_t *) location) | ||
| 353 | = (*((uint16_t *) location) & ~0xffff) | ||
| 354 | | (value & 0xffff); | ||
| 355 | break; | ||
| 356 | |||
| 344 | case R_PPC64_TOC16_DS: | 357 | case R_PPC64_TOC16_DS: |
| 345 | /* Subtact TOC pointer */ | 358 | /* Subtact TOC pointer */ |
| 346 | value -= my_r2(sechdrs, me); | 359 | value -= my_r2(sechdrs, me); |
