diff options
Diffstat (limited to 'arch/arm/kernel/module.c')
| -rw-r--r-- | arch/arm/kernel/module.c | 42 | 
1 files changed, 12 insertions, 30 deletions
diff --git a/arch/arm/kernel/module.c b/arch/arm/kernel/module.c index fee7c36349eb..05b377616fd5 100644 --- a/arch/arm/kernel/module.c +++ b/arch/arm/kernel/module.c @@ -43,25 +43,7 @@ void *module_alloc(unsigned long size)  				GFP_KERNEL, PAGE_KERNEL_EXEC, -1,  				__builtin_return_address(0));  } -#else /* CONFIG_MMU */ -void *module_alloc(unsigned long size) -{ -	return size == 0 ? NULL : vmalloc(size); -} -#endif /* !CONFIG_MMU */ - -void module_free(struct module *module, void *region) -{ -	vfree(region); -} - -int module_frob_arch_sections(Elf_Ehdr *hdr, -			      Elf_Shdr *sechdrs, -			      char *secstrings, -			      struct module *mod) -{ -	return 0; -} +#endif  int  apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex, @@ -193,8 +175,17 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,  				offset -= 0x02000000;  			offset += sym->st_value - loc; -			/* only Thumb addresses allowed (no interworking) */ -			if (!(offset & 1) || +			/* +			 * For function symbols, only Thumb addresses are +			 * allowed (no interworking). +			 * +			 * For non-function symbols, the destination +			 * has no specific ARM/Thumb disposition, so +			 * the branch is resolved under the assumption +			 * that interworking is not required. +			 */ +			if ((ELF32_ST_TYPE(sym->st_info) == STT_FUNC && +				!(offset & 1)) ||  			    offset <= (s32)0xff000000 ||  			    offset >= (s32)0x01000000) {  				pr_err("%s: section %u reloc %u sym '%s': relocation %u out of range (%#lx -> %#x)\n", @@ -256,15 +247,6 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,  	return 0;  } -int -apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, -		   unsigned int symindex, unsigned int relsec, struct module *module) -{ -	printk(KERN_ERR "module %s: ADD RELOCATION unsupported\n", -	       module->name); -	return -ENOEXEC; -} -  struct mod_unwind_map {  	const Elf_Shdr *unw_sec;  	const Elf_Shdr *txt_sec;  |