diff options
Diffstat (limited to 'arch/ia64/kernel/module.c')
| -rw-r--r-- | arch/ia64/kernel/module.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/arch/ia64/kernel/module.c b/arch/ia64/kernel/module.c index febc091c2f02..f1aca7cffd12 100644 --- a/arch/ia64/kernel/module.c +++ b/arch/ia64/kernel/module.c | |||
| @@ -825,14 +825,16 @@ apply_relocate_add (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symind | |||
| 825 | * XXX Should have an arch-hook for running this after final section | 825 | * XXX Should have an arch-hook for running this after final section |
| 826 | * addresses have been selected... | 826 | * addresses have been selected... |
| 827 | */ | 827 | */ |
| 828 | /* See if gp can cover the entire core module: */ | 828 | uint64_t gp; |
| 829 | uint64_t gp = (uint64_t) mod->module_core + MAX_LTOFF / 2; | 829 | if (mod->core_size > MAX_LTOFF) |
| 830 | if (mod->core_size >= MAX_LTOFF) | ||
| 831 | /* | 830 | /* |
| 832 | * This takes advantage of fact that SHF_ARCH_SMALL gets allocated | 831 | * This takes advantage of fact that SHF_ARCH_SMALL gets allocated |
| 833 | * at the end of the module. | 832 | * at the end of the module. |
| 834 | */ | 833 | */ |
| 835 | gp = (uint64_t) mod->module_core + mod->core_size - MAX_LTOFF / 2; | 834 | gp = mod->core_size - MAX_LTOFF / 2; |
| 835 | else | ||
| 836 | gp = mod->core_size / 2; | ||
| 837 | gp = (uint64_t) mod->module_core + ((gp + 7) & -8); | ||
| 836 | mod->arch.gp = gp; | 838 | mod->arch.gp = gp; |
| 837 | DEBUGP("%s: placing gp at 0x%lx\n", __FUNCTION__, gp); | 839 | DEBUGP("%s: placing gp at 0x%lx\n", __FUNCTION__, gp); |
| 838 | } | 840 | } |
