Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

ARM: 9471/1: module: fix unwind section relocation out of range error

In an armv7 system that uses non-3G/1G split and with more than 512MB physical memory, driver load may fail with following error:
section 29 reloc 0 sym '': relocation 42 out of range (0xc2ab9be8 ->
0x7fad5998)

This happens when relocation R_ARM_PREL31 from the unwind section
.ARM.extab and .ARM.exidx are allocated from the VMALLOC space while
.text section is from MODULES_VADDR space. It exceeds the +/-1GB
relocation requirement of R_ARM_PREL31 hence triggers the error.

The fix is to mark .ARM.extab and .ARM.exidx sections as executable so
they can be allocated along with .text section and always meet range
requirement.

Co-developed-by: Ard Biesheuvel <ardb@kernel.org>

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: William Zhang <william.zhang@broadcom.com>
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>

authored by

William Zhang and committed by
Russell King (Oracle)
5a21253b 6de23f81

+12
+12
arch/arm/kernel/module-plts.c
··· 225 225 mod->arch.init.plt = s; 226 226 else if (s->sh_type == SHT_SYMTAB) 227 227 syms = (Elf32_Sym *)s->sh_addr; 228 + #if defined(CONFIG_ARM_UNWIND) && !defined(CONFIG_VMSPLIT_3G) 229 + else if (s->sh_type == ELF_SECTION_UNWIND || 230 + (strncmp(".ARM.extab", secstrings + s->sh_name, 10) == 0)) { 231 + /* 232 + * To avoid the possible relocation out of range issue for 233 + * R_ARM_PREL31, mark unwind section .ARM.extab and .ARM.exidx as 234 + * executable so they will be allocated along with .text section to 235 + * meet +/-1GB range requirement of the R_ARM_PREL31 relocation 236 + */ 237 + s->sh_flags |= SHF_EXECINSTR; 238 + } 239 + #endif 228 240 } 229 241 230 242 if (!mod->arch.core.plt || !mod->arch.init.plt) {