Make most arch asm/module.h files use asm-generic/module.h
Use the mapping of Elf_[SPE]hdr, Elf_Addr, Elf_Sym, Elf_Dyn, Elf_Rel/Rela,
ELF_R_TYPE() and ELF_R_SYM() to either the 32-bit version or the 64-bit version
into asm-generic/module.h for all arches bar MIPS.
Also, use the generic definition mod_arch_specific where possible.
To this end, I've defined three new config bools:
 (*) HAVE_MOD_ARCH_SPECIFIC
     Arches define this if they don't want to use the empty generic
     mod_arch_specific struct.
 (*) MODULES_USE_ELF_RELA
     Arches define this if their modules can contain RELA records.  This causes
     the Elf_Rela mapping to be emitted and allows apply_relocate_add() to be
     defined by the arch rather than have the core emit an error message.
 (*) MODULES_USE_ELF_REL
     Arches define this if their modules can contain REL records.  This causes
     the Elf_Rel mapping to be emitted and allows apply_relocate() to be
     defined by the arch rather than have the core emit an error message.
Note that it is possible to allow both REL and RELA records: m68k and mips are
two arches that do this.
With this, some arch asm/module.h files can be deleted entirely and replaced
with a generic-y marker in the arch Kbuild file.
Additionally, I have removed the bits from m32r and score that handle the
unsupported type of relocation record as that's now handled centrally.
Signed-off-by: David Howells <dhowells@redhat.com>
Acked-by: Sam Ravnborg <sam@ravnborg.org>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
	
	
This commit is contained in:
		
					parent
					
						
							
								6ede81239e
							
						
					
				
			
			
				commit
				
					
						786d35d45c
					
				
			
		
					 57 changed files with 168 additions and 224 deletions
				
			
		
							
								
								
									
										19
									
								
								arch/Kconfig
									
										
									
									
									
								
							
							
						
						
									
										19
									
								
								arch/Kconfig
									
										
									
									
									
								
							|  | @ -281,4 +281,23 @@ config SECCOMP_FILTER | |||
| 
 | ||||
| 	  See Documentation/prctl/seccomp_filter.txt for details. | ||||
| 
 | ||||
| config HAVE_MOD_ARCH_SPECIFIC | ||||
| 	bool | ||||
| 	help | ||||
| 	  The arch uses struct mod_arch_specific to store data.  Many arches | ||||
| 	  just need a simple module loader without arch specific data - those | ||||
| 	  should not enable this. | ||||
| 
 | ||||
| config MODULES_USE_ELF_RELA | ||||
| 	bool | ||||
| 	help | ||||
| 	  Modules only use ELF RELA relocations.  Modules with ELF REL | ||||
| 	  relocations will give an error. | ||||
| 
 | ||||
| config MODULES_USE_ELF_REL | ||||
| 	bool | ||||
| 	help | ||||
| 	  Modules only use ELF REL relocations.  Modules with ELF RELA | ||||
| 	  relocations will give an error. | ||||
| 
 | ||||
| source "kernel/gcov/Kconfig" | ||||
|  |  | |||
|  | @ -20,6 +20,8 @@ config ALPHA | |||
| 	select GENERIC_CMOS_UPDATE | ||||
| 	select GENERIC_STRNCPY_FROM_USER | ||||
| 	select GENERIC_STRNLEN_USER | ||||
| 	select HAVE_MOD_ARCH_SPECIFIC | ||||
| 	select MODULES_USE_ELF_RELA | ||||
| 	help | ||||
| 	  The Alpha is a 64-bit general-purpose processor designed and | ||||
| 	  marketed by the Digital Equipment Corporation of blessed memory, | ||||
|  |  | |||
|  | @ -1,19 +1,13 @@ | |||
| #ifndef _ALPHA_MODULE_H | ||||
| #define _ALPHA_MODULE_H | ||||
| 
 | ||||
| #include <asm-generic/module.h> | ||||
| 
 | ||||
| struct mod_arch_specific | ||||
| { | ||||
| 	unsigned int gotsecindex; | ||||
| }; | ||||
| 
 | ||||
| #define Elf_Sym Elf64_Sym | ||||
| #define Elf_Shdr Elf64_Shdr | ||||
| #define Elf_Ehdr Elf64_Ehdr | ||||
| #define Elf_Phdr Elf64_Phdr | ||||
| #define Elf_Dyn Elf64_Dyn | ||||
| #define Elf_Rel Elf64_Rel | ||||
| #define Elf_Rela Elf64_Rela | ||||
| 
 | ||||
| #define ARCH_SHF_SMALL SHF_ALPHA_GPREL | ||||
| 
 | ||||
| #ifdef MODULE | ||||
|  |  | |||
|  | @ -49,6 +49,8 @@ config ARM | |||
| 	select GENERIC_STRNCPY_FROM_USER | ||||
| 	select GENERIC_STRNLEN_USER | ||||
| 	select DCACHE_WORD_ACCESS if (CPU_V6 || CPU_V6K || CPU_V7) && !CPU_BIG_ENDIAN | ||||
| 	select HAVE_MOD_ARCH_SPECIFIC if ARM_UNWIND | ||||
| 	select MODULES_USE_ELF_REL | ||||
| 	help | ||||
| 	  The ARM series is a line of low-power-consumption RISC chip designs | ||||
| 	  licensed by ARM Ltd and targeted at embedded applications and | ||||
|  |  | |||
|  | @ -1,9 +1,7 @@ | |||
| #ifndef _ASM_ARM_MODULE_H | ||||
| #define _ASM_ARM_MODULE_H | ||||
| 
 | ||||
| #define Elf_Shdr	Elf32_Shdr | ||||
| #define Elf_Sym		Elf32_Sym | ||||
| #define Elf_Ehdr	Elf32_Ehdr | ||||
| #include <asm-generic/module.h> | ||||
| 
 | ||||
| struct unwind_table; | ||||
| 
 | ||||
|  | @ -16,13 +14,11 @@ enum { | |||
| 	ARM_SEC_DEVEXIT, | ||||
| 	ARM_SEC_MAX, | ||||
| }; | ||||
| #endif | ||||
| 
 | ||||
| struct mod_arch_specific { | ||||
| #ifdef CONFIG_ARM_UNWIND | ||||
| 	struct unwind_table *unwind[ARM_SEC_MAX]; | ||||
| #endif | ||||
| }; | ||||
| #endif | ||||
| 
 | ||||
| /*
 | ||||
|  * Add the ARM architecture version to the version magic string | ||||
|  |  | |||
|  | @ -15,6 +15,8 @@ config AVR32 | |||
| 	select ARCH_WANT_IPC_PARSE_VERSION | ||||
| 	select ARCH_HAVE_NMI_SAFE_CMPXCHG | ||||
| 	select GENERIC_CLOCKEVENTS | ||||
| 	select HAVE_MOD_ARCH_SPECIFIC | ||||
| 	select MODULES_USE_ELF_RELA | ||||
| 	help | ||||
| 	  AVR32 is a high-performance 32-bit RISC microprocessor core, | ||||
| 	  designed for cost-sensitive embedded applications, with particular | ||||
|  |  | |||
|  | @ -1,6 +1,8 @@ | |||
| #ifndef __ASM_AVR32_MODULE_H | ||||
| #define __ASM_AVR32_MODULE_H | ||||
| 
 | ||||
| #include <asm-generic/module.h> | ||||
| 
 | ||||
| struct mod_arch_syminfo { | ||||
| 	unsigned long got_offset; | ||||
| 	int got_initialized; | ||||
|  | @ -17,10 +19,6 @@ struct mod_arch_specific { | |||
| 	struct mod_arch_syminfo *syminfo; | ||||
| }; | ||||
| 
 | ||||
| #define Elf_Shdr		Elf32_Shdr | ||||
| #define Elf_Sym			Elf32_Sym | ||||
| #define Elf_Ehdr		Elf32_Ehdr | ||||
| 
 | ||||
| #define MODULE_PROC_FAMILY "AVR32v1" | ||||
| 
 | ||||
| #define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY | ||||
|  |  | |||
|  | @ -42,6 +42,8 @@ config BLACKFIN | |||
| 	select HAVE_NMI_WATCHDOG if NMI_WATCHDOG | ||||
| 	select GENERIC_SMP_IDLE_THREAD | ||||
| 	select ARCH_USES_GETTIMEOFFSET if !GENERIC_CLOCKEVENTS | ||||
| 	select HAVE_MOD_ARCH_SPECIFIC | ||||
| 	select MODULES_USE_ELF_RELA | ||||
| 
 | ||||
| config GENERIC_CSUM | ||||
| 	def_bool y | ||||
|  |  | |||
|  | @ -7,9 +7,7 @@ | |||
| #ifndef _ASM_BFIN_MODULE_H | ||||
| #define _ASM_BFIN_MODULE_H | ||||
| 
 | ||||
| #define Elf_Shdr        Elf32_Shdr | ||||
| #define Elf_Sym         Elf32_Sym | ||||
| #define Elf_Ehdr        Elf32_Ehdr | ||||
| #include <asm-generic/module.h> | ||||
| 
 | ||||
| struct mod_arch_specific { | ||||
| 	Elf_Shdr	*text_l1; | ||||
|  |  | |||
|  | @ -17,6 +17,7 @@ config C6X | |||
| 	select OF | ||||
| 	select OF_EARLY_FLATTREE | ||||
| 	select GENERIC_CLOCKEVENTS | ||||
| 	select MODULES_USE_ELF_RELA | ||||
| 
 | ||||
| config MMU | ||||
| 	def_bool n | ||||
|  |  | |||
|  | @ -13,17 +13,7 @@ | |||
| #ifndef _ASM_C6X_MODULE_H | ||||
| #define _ASM_C6X_MODULE_H | ||||
| 
 | ||||
| #define Elf_Shdr	Elf32_Shdr | ||||
| #define Elf_Sym		Elf32_Sym | ||||
| #define Elf_Ehdr	Elf32_Ehdr | ||||
| #define Elf_Addr	Elf32_Addr | ||||
| #define Elf_Word	Elf32_Word | ||||
| 
 | ||||
| /*
 | ||||
|  * This file contains the C6x architecture specific module code. | ||||
|  */ | ||||
| struct mod_arch_specific { | ||||
| }; | ||||
| #include <asm-generic/module.h> | ||||
| 
 | ||||
| struct loaded_sections { | ||||
| 	unsigned int new_vaddr; | ||||
|  |  | |||
|  | @ -47,6 +47,7 @@ config CRIS | |||
| 	select GENERIC_IOMAP | ||||
| 	select GENERIC_SMP_IDLE_THREAD if ETRAX_ARCH_V32 | ||||
| 	select GENERIC_CMOS_UPDATE | ||||
| 	select MODULES_USE_ELF_RELA | ||||
| 
 | ||||
| config HZ | ||||
| 	int | ||||
|  |  | |||
|  | @ -7,3 +7,5 @@ header-y += ethernet.h | |||
| header-y += etraxgpio.h | ||||
| header-y += rs485.h | ||||
| header-y += sync_serial.h | ||||
| 
 | ||||
| generic-y += module.h | ||||
|  |  | |||
|  | @ -1,9 +0,0 @@ | |||
| #ifndef _ASM_CRIS_MODULE_H | ||||
| #define _ASM_CRIS_MODULE_H | ||||
| /* cris is simple */ | ||||
| struct mod_arch_specific { }; | ||||
| 
 | ||||
| #define Elf_Shdr Elf32_Shdr | ||||
| #define Elf_Sym Elf32_Sym | ||||
| #define Elf_Ehdr Elf32_Ehdr | ||||
| #endif /* _ASM_CRIS_MODULE_H */ | ||||
|  | @ -11,13 +11,7 @@ | |||
| #ifndef _ASM_MODULE_H | ||||
| #define _ASM_MODULE_H | ||||
| 
 | ||||
| struct mod_arch_specific | ||||
| { | ||||
| }; | ||||
| 
 | ||||
| #define Elf_Shdr	Elf32_Shdr | ||||
| #define Elf_Sym		Elf32_Sym | ||||
| #define Elf_Ehdr	Elf32_Ehdr | ||||
| #include <asm-generic/module.h> | ||||
| 
 | ||||
| /*
 | ||||
|  * Include the architecture version. | ||||
|  |  | |||
|  | @ -6,6 +6,7 @@ config H8300 | |||
| 	select ARCH_WANT_IPC_PARSE_VERSION | ||||
| 	select GENERIC_IRQ_SHOW | ||||
| 	select GENERIC_CPU_DEVICES | ||||
| 	select MODULES_USE_ELF_RELA | ||||
| 
 | ||||
| config SYMBOL_PREFIX | ||||
| 	string | ||||
|  |  | |||
|  | @ -1 +1,3 @@ | |||
| include include/asm-generic/Kbuild.asm | ||||
| 
 | ||||
| generic-y	+= module.h | ||||
|  |  | |||
|  | @ -1,11 +0,0 @@ | |||
| #ifndef _ASM_H8300_MODULE_H | ||||
| #define _ASM_H8300_MODULE_H | ||||
| /*
 | ||||
|  * This file contains the H8/300 architecture specific module code. | ||||
|  */ | ||||
| struct mod_arch_specific { }; | ||||
| #define Elf_Shdr Elf32_Shdr | ||||
| #define Elf_Sym Elf32_Sym | ||||
| #define Elf_Ehdr Elf32_Ehdr | ||||
| 
 | ||||
| #endif /* _ASM_H8/300_MODULE_H */ | ||||
|  | @ -30,6 +30,7 @@ config HEXAGON | |||
| 	select KTIME_SCALAR | ||||
| 	select GENERIC_CLOCKEVENTS | ||||
| 	select GENERIC_CLOCKEVENTS_BROADCAST | ||||
| 	select MODULES_USE_ELF_RELA | ||||
| 	---help--- | ||||
| 	  Qualcomm Hexagon is a processor architecture designed for high | ||||
| 	  performance and low power across a wide variety of applications. | ||||
|  |  | |||
|  | @ -39,6 +39,8 @@ config IA64 | |||
| 	select ARCH_THREAD_INFO_ALLOCATOR | ||||
| 	select ARCH_CLOCKSOURCE_DATA | ||||
| 	select GENERIC_TIME_VSYSCALL | ||||
| 	select HAVE_MOD_ARCH_SPECIFIC | ||||
| 	select MODULES_USE_ELF_RELA | ||||
| 	default y | ||||
| 	help | ||||
| 	  The Itanium Processor Family is Intel's 64-bit successor to | ||||
|  |  | |||
|  | @ -1,6 +1,8 @@ | |||
| #ifndef _ASM_IA64_MODULE_H | ||||
| #define _ASM_IA64_MODULE_H | ||||
| 
 | ||||
| #include <asm-generic/module.h> | ||||
| 
 | ||||
| /*
 | ||||
|  * IA-64-specific support for kernel module loader. | ||||
|  * | ||||
|  | @ -29,10 +31,6 @@ struct mod_arch_specific { | |||
| 	unsigned int next_got_entry;	/* index of next available got entry */ | ||||
| }; | ||||
| 
 | ||||
| #define Elf_Shdr	Elf64_Shdr | ||||
| #define Elf_Sym		Elf64_Sym | ||||
| #define Elf_Ehdr	Elf64_Ehdr | ||||
| 
 | ||||
| #define MODULE_PROC_FAMILY	"ia64" | ||||
| #define MODULE_ARCH_VERMAGIC	MODULE_PROC_FAMILY \ | ||||
| 	"gcc-" __stringify(__GNUC__) "." __stringify(__GNUC_MINOR__) | ||||
|  |  | |||
|  | @ -13,6 +13,7 @@ config M32R | |||
| 	select GENERIC_IRQ_SHOW | ||||
| 	select GENERIC_ATOMIC64 | ||||
| 	select ARCH_USES_GETTIMEOFFSET | ||||
| 	select MODULES_USE_ELF_RELA | ||||
| 
 | ||||
| config SBUS | ||||
| 	bool | ||||
|  |  | |||
|  | @ -1 +1,3 @@ | |||
| include include/asm-generic/Kbuild.asm | ||||
| 
 | ||||
| generic-y	+= module.h | ||||
|  |  | |||
|  | @ -1,10 +0,0 @@ | |||
| #ifndef _ASM_M32R_MODULE_H | ||||
| #define _ASM_M32R_MODULE_H | ||||
| 
 | ||||
| struct mod_arch_specific { }; | ||||
| 
 | ||||
| #define Elf_Shdr	Elf32_Shdr | ||||
| #define Elf_Sym		Elf32_Sym | ||||
| #define Elf_Ehdr	Elf32_Ehdr | ||||
| 
 | ||||
| #endif /* _ASM_M32R_MODULE_H */ | ||||
|  | @ -201,18 +201,3 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, | |||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| int apply_relocate(Elf32_Shdr *sechdrs, | ||||
| 		       const char *strtab, | ||||
| 		       unsigned int symindex, | ||||
| 		       unsigned int relsec, | ||||
| 		       struct module *me) | ||||
| { | ||||
| #if 0 | ||||
| 	printk(KERN_ERR "module %s: REL RELOCATION unsupported\n", | ||||
| 	       me->name); | ||||
| 	return -ENOEXEC; | ||||
| #endif | ||||
| 	return 0; | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -13,6 +13,9 @@ config M68K | |||
| 	select FPU if MMU | ||||
| 	select ARCH_WANT_IPC_PARSE_VERSION | ||||
| 	select ARCH_USES_GETTIMEOFFSET if MMU && !COLDFIRE | ||||
| 	select HAVE_MOD_ARCH_SPECIFIC | ||||
| 	select MODULES_USE_ELF_REL | ||||
| 	select MODULES_USE_ELF_RELA | ||||
| 
 | ||||
| config RWSEM_GENERIC_SPINLOCK | ||||
| 	bool | ||||
|  |  | |||
|  | @ -1,6 +1,8 @@ | |||
| #ifndef _ASM_M68K_MODULE_H | ||||
| #define _ASM_M68K_MODULE_H | ||||
| 
 | ||||
| #include <asm-generic/module.h> | ||||
| 
 | ||||
| enum m68k_fixup_type { | ||||
| 	m68k_fixup_memoffset, | ||||
| 	m68k_fixup_vnode_shift, | ||||
|  | @ -36,8 +38,4 @@ struct module; | |||
| extern void module_fixup(struct module *mod, struct m68k_fixup_info *start, | ||||
| 			 struct m68k_fixup_info *end); | ||||
| 
 | ||||
| #define Elf_Shdr Elf32_Shdr | ||||
| #define Elf_Sym Elf32_Sym | ||||
| #define Elf_Ehdr Elf32_Ehdr | ||||
| 
 | ||||
| #endif /* _ASM_M68K_MODULE_H */ | ||||
|  |  | |||
|  | @ -24,6 +24,7 @@ config MICROBLAZE | |||
| 	select GENERIC_CPU_DEVICES | ||||
| 	select GENERIC_ATOMIC64 | ||||
| 	select GENERIC_CLOCKEVENTS | ||||
| 	select MODULES_USE_ELF_RELA | ||||
| 
 | ||||
| config SWAP | ||||
| 	def_bool n | ||||
|  |  | |||
|  | @ -36,6 +36,9 @@ config MIPS | |||
| 	select BUILDTIME_EXTABLE_SORT | ||||
| 	select GENERIC_CLOCKEVENTS | ||||
| 	select GENERIC_CMOS_UPDATE | ||||
| 	select HAVE_MOD_ARCH_SPECIFIC | ||||
| 	select MODULES_USE_ELF_REL | ||||
| 	select MODULES_USE_ELF_RELA if 64BIT | ||||
| 
 | ||||
| menu "Machine selection" | ||||
| 
 | ||||
|  |  | |||
|  | @ -35,11 +35,14 @@ typedef struct { | |||
| } Elf64_Mips_Rela; | ||||
| 
 | ||||
| #ifdef CONFIG_32BIT | ||||
| 
 | ||||
| #define Elf_Shdr	Elf32_Shdr | ||||
| #define Elf_Sym		Elf32_Sym | ||||
| #define Elf_Ehdr	Elf32_Ehdr | ||||
| #define Elf_Addr	Elf32_Addr | ||||
| #define Elf_Rel		Elf32_Rel | ||||
| #define Elf_Rela	Elf32_Rela | ||||
| #define ELF_R_TYPE(X)	ELF32_R_TYPE(X) | ||||
| #define ELF_R_SYM(X)	ELF32_R_SYM(X) | ||||
| 
 | ||||
| #define Elf_Mips_Rel	Elf32_Rel | ||||
| #define Elf_Mips_Rela	Elf32_Rela | ||||
|  | @ -50,11 +53,14 @@ typedef struct { | |||
| #endif | ||||
| 
 | ||||
| #ifdef CONFIG_64BIT | ||||
| 
 | ||||
| #define Elf_Shdr	Elf64_Shdr | ||||
| #define Elf_Sym		Elf64_Sym | ||||
| #define Elf_Ehdr	Elf64_Ehdr | ||||
| #define Elf_Addr	Elf64_Addr | ||||
| #define Elf_Rel		Elf64_Rel | ||||
| #define Elf_Rela	Elf64_Rela | ||||
| #define ELF_R_TYPE(X)	ELF64_R_TYPE(X) | ||||
| #define ELF_R_SYM(X)	ELF64_R_SYM(X) | ||||
| 
 | ||||
| #define Elf_Mips_Rel	Elf64_Mips_Rel | ||||
| #define Elf_Mips_Rela	Elf64_Mips_Rela | ||||
|  |  | |||
|  | @ -31,7 +31,7 @@ obj-$(CONFIG_SYNC_R4K)		+= sync-r4k.o | |||
| 
 | ||||
| obj-$(CONFIG_STACKTRACE)	+= stacktrace.o | ||||
| obj-$(CONFIG_MODULES)		+= mips_ksyms.o module.o | ||||
| obj-$(CONFIG_MODULES)		+= module-rela.o | ||||
| obj-$(CONFIG_MODULES_USE_ELF_RELA) += module-rela.o | ||||
| 
 | ||||
| obj-$(CONFIG_FUNCTION_TRACER)	+= mcount.o ftrace.o | ||||
| 
 | ||||
|  |  | |||
|  | @ -8,6 +8,7 @@ config MN10300 | |||
| 	select HAVE_ARCH_KGDB | ||||
| 	select HAVE_NMI_WATCHDOG if MN10300_WD_TIMER | ||||
| 	select GENERIC_CLOCKEVENTS | ||||
| 	select MODULES_USE_ELF_RELA | ||||
| 
 | ||||
| config AM33_2 | ||||
| 	def_bool n | ||||
|  |  | |||
|  | @ -12,12 +12,7 @@ | |||
| #ifndef _ASM_MODULE_H | ||||
| #define _ASM_MODULE_H | ||||
| 
 | ||||
| struct mod_arch_specific { | ||||
| }; | ||||
| 
 | ||||
| #define Elf_Shdr	Elf32_Shdr | ||||
| #define Elf_Sym		Elf32_Sym | ||||
| #define Elf_Ehdr	Elf32_Ehdr | ||||
| #include <asm-generic/module.h> | ||||
| 
 | ||||
| /*
 | ||||
|  * Include the MN10300 architecture version. | ||||
|  |  | |||
|  | @ -21,6 +21,7 @@ config OPENRISC | |||
| 	select GENERIC_CLOCKEVENTS | ||||
| 	select GENERIC_STRNCPY_FROM_USER | ||||
| 	select GENERIC_STRNLEN_USER | ||||
| 	select MODULES_USE_ELF_RELA | ||||
| 
 | ||||
| config MMU | ||||
| 	def_bool y | ||||
|  |  | |||
|  | @ -19,6 +19,8 @@ config PARISC | |||
| 	select ARCH_HAVE_NMI_SAFE_CMPXCHG | ||||
| 	select GENERIC_SMP_IDLE_THREAD | ||||
| 	select GENERIC_STRNCPY_FROM_USER | ||||
| 	select HAVE_MOD_ARCH_SPECIFIC | ||||
| 	select MODULES_USE_ELF_RELA | ||||
| 
 | ||||
| 	help | ||||
| 	  The PA-RISC microprocessor is designed by Hewlett-Packard and used | ||||
|  |  | |||
|  | @ -1,21 +1,11 @@ | |||
| #ifndef _ASM_PARISC_MODULE_H | ||||
| #define _ASM_PARISC_MODULE_H | ||||
| 
 | ||||
| #include <asm-generic/module.h> | ||||
| 
 | ||||
| /*
 | ||||
|  * This file contains the parisc architecture specific module code. | ||||
|  */ | ||||
| #ifdef CONFIG_64BIT | ||||
| #define Elf_Shdr Elf64_Shdr | ||||
| #define Elf_Sym Elf64_Sym | ||||
| #define Elf_Ehdr Elf64_Ehdr | ||||
| #define Elf_Addr Elf64_Addr | ||||
| #define Elf_Rela Elf64_Rela | ||||
| #else | ||||
| #define Elf_Shdr Elf32_Shdr | ||||
| #define Elf_Sym Elf32_Sym | ||||
| #define Elf_Ehdr Elf32_Ehdr | ||||
| #define Elf_Addr Elf32_Addr | ||||
| #define Elf_Rela Elf32_Rela | ||||
| #endif | ||||
| 
 | ||||
| struct unwind_table; | ||||
| 
 | ||||
|  |  | |||
|  | @ -139,6 +139,8 @@ config PPC | |||
| 	select GENERIC_CLOCKEVENTS | ||||
| 	select GENERIC_STRNCPY_FROM_USER | ||||
| 	select GENERIC_STRNLEN_USER | ||||
| 	select HAVE_MOD_ARCH_SPECIFIC | ||||
| 	select MODULES_USE_ELF_RELA | ||||
| 
 | ||||
| config EARLY_PRINTK | ||||
| 	bool | ||||
|  |  | |||
|  | @ -11,6 +11,7 @@ | |||
| 
 | ||||
| #include <linux/list.h> | ||||
| #include <asm/bug.h> | ||||
| #include <asm-generic/module.h> | ||||
| 
 | ||||
| 
 | ||||
| #ifndef __powerpc64__ | ||||
|  | @ -60,16 +61,10 @@ struct mod_arch_specific { | |||
|  */ | ||||
| 
 | ||||
| #ifdef __powerpc64__ | ||||
| #    define Elf_Shdr	Elf64_Shdr | ||||
| #    define Elf_Sym	Elf64_Sym | ||||
| #    define Elf_Ehdr	Elf64_Ehdr | ||||
| #    ifdef MODULE | ||||
| 	asm(".section .stubs,\"ax\",@nobits; .align 3; .previous"); | ||||
| #    endif | ||||
| #else | ||||
| #    define Elf_Shdr	Elf32_Shdr | ||||
| #    define Elf_Sym	Elf32_Sym | ||||
| #    define Elf_Ehdr	Elf32_Ehdr | ||||
| #    ifdef MODULE | ||||
| 	asm(".section .plt,\"ax\",@nobits; .align 3; .previous"); | ||||
| 	asm(".section .init.plt,\"ax\",@nobits; .align 3; .previous"); | ||||
|  |  | |||
|  | @ -125,6 +125,8 @@ config S390 | |||
| 	select GENERIC_CLOCKEVENTS | ||||
| 	select KTIME_SCALAR if 32BIT | ||||
| 	select HAVE_ARCH_SECCOMP_FILTER | ||||
| 	select HAVE_MOD_ARCH_SPECIFIC | ||||
| 	select MODULES_USE_ELF_RELA | ||||
| 
 | ||||
| config SCHED_OMIT_FRAME_POINTER | ||||
| 	def_bool y | ||||
|  |  | |||
|  | @ -1,5 +1,8 @@ | |||
| #ifndef _ASM_S390_MODULE_H | ||||
| #define _ASM_S390_MODULE_H | ||||
| 
 | ||||
| #include <asm-generic/module.h> | ||||
| 
 | ||||
| /*
 | ||||
|  * This file contains the s390 architecture specific module code. | ||||
|  */ | ||||
|  | @ -28,19 +31,4 @@ struct mod_arch_specific | |||
| 	struct mod_arch_syminfo *syminfo; | ||||
| }; | ||||
| 
 | ||||
| #ifdef CONFIG_64BIT | ||||
| #define ElfW(x) Elf64_ ## x | ||||
| #define ELFW(x) ELF64_ ## x | ||||
| #else | ||||
| #define ElfW(x) Elf32_ ## x | ||||
| #define ELFW(x) ELF32_ ## x | ||||
| #endif | ||||
| 
 | ||||
| #define Elf_Addr ElfW(Addr) | ||||
| #define Elf_Rela ElfW(Rela) | ||||
| #define Elf_Shdr ElfW(Shdr) | ||||
| #define Elf_Sym ElfW(Sym) | ||||
| #define Elf_Ehdr ElfW(Ehdr) | ||||
| #define ELF_R_SYM ELFW(R_SYM) | ||||
| #define ELF_R_TYPE ELFW(R_TYPE) | ||||
| #endif /* _ASM_S390_MODULE_H */ | ||||
|  |  | |||
|  | @ -10,6 +10,8 @@ config SCORE | |||
|        select ARCH_DISCARD_MEMBLOCK | ||||
|        select GENERIC_CPU_DEVICES | ||||
|        select GENERIC_CLOCKEVENTS | ||||
|        select HAVE_MOD_ARCH_SPECIFIC | ||||
| 	select MODULES_USE_ELF_REL | ||||
| 
 | ||||
| choice | ||||
| 	prompt "System type" | ||||
|  |  | |||
|  | @ -3,6 +3,7 @@ | |||
| 
 | ||||
| #include <linux/list.h> | ||||
| #include <asm/uaccess.h> | ||||
| #include <asm-generic/module.h> | ||||
| 
 | ||||
| struct mod_arch_specific { | ||||
| 	/* Data Bus Error exception tables */ | ||||
|  | @ -13,11 +14,6 @@ struct mod_arch_specific { | |||
| 
 | ||||
| typedef uint8_t Elf64_Byte;		/* Type for a 8-bit quantity. */ | ||||
| 
 | ||||
| #define Elf_Shdr	Elf32_Shdr | ||||
| #define Elf_Sym		Elf32_Sym | ||||
| #define Elf_Ehdr	Elf32_Ehdr | ||||
| #define Elf_Addr	Elf32_Addr | ||||
| 
 | ||||
| /* Given an address, look for it in the exception tables. */ | ||||
| #ifdef CONFIG_MODULES | ||||
| const struct exception_table_entry *search_module_dbetables(unsigned long addr); | ||||
|  |  | |||
|  | @ -125,16 +125,6 @@ int apply_relocate(Elf_Shdr *sechdrs, const char *strtab, | |||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab, | ||||
| 		unsigned int symindex, unsigned int relsec, | ||||
| 		struct module *me) | ||||
| { | ||||
| 	/* Non-standard return value... most other arch's return -ENOEXEC
 | ||||
| 	 * for an unsupported relocation variant | ||||
| 	 */ | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| /* Given an address, look for it in the module exception tables. */ | ||||
| const struct exception_table_entry *search_module_dbetables(unsigned long addr) | ||||
| { | ||||
|  |  | |||
|  | @ -35,6 +35,8 @@ config SUPERH | |||
| 	select GENERIC_CMOS_UPDATE if SH_SH03 || SH_DREAMCAST | ||||
| 	select GENERIC_STRNCPY_FROM_USER | ||||
| 	select GENERIC_STRNLEN_USER | ||||
| 	select HAVE_MOD_ARCH_SPECIFIC if DWARF_UNWINDER | ||||
| 	select MODULES_USE_ELF_RELA | ||||
| 	help | ||||
| 	  The SuperH is a RISC processor targeted for use in embedded systems | ||||
| 	  and consumer electronics; it was also used in the Sega Dreamcast | ||||
|  |  | |||
|  | @ -1,21 +1,13 @@ | |||
| #ifndef _ASM_SH_MODULE_H | ||||
| #define _ASM_SH_MODULE_H | ||||
| 
 | ||||
| struct mod_arch_specific { | ||||
| #include <asm-generic/module.h> | ||||
| 
 | ||||
| #ifdef CONFIG_DWARF_UNWINDER | ||||
| struct mod_arch_specific { | ||||
| 	struct list_head fde_list; | ||||
| 	struct list_head cie_list; | ||||
| #endif | ||||
| }; | ||||
| 
 | ||||
| #ifdef CONFIG_64BIT | ||||
| #define Elf_Shdr Elf64_Shdr | ||||
| #define Elf_Sym Elf64_Sym | ||||
| #define Elf_Ehdr Elf64_Ehdr | ||||
| #else | ||||
| #define Elf_Shdr Elf32_Shdr | ||||
| #define Elf_Sym Elf32_Sym | ||||
| #define Elf_Ehdr Elf32_Ehdr | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CONFIG_CPU_LITTLE_ENDIAN | ||||
|  |  | |||
|  | @ -37,6 +37,7 @@ config SPARC | |||
| 	select GENERIC_CLOCKEVENTS | ||||
| 	select GENERIC_STRNCPY_FROM_USER | ||||
| 	select GENERIC_STRNLEN_USER | ||||
| 	select MODULES_USE_ELF_RELA | ||||
| 
 | ||||
| config SPARC32 | ||||
| 	def_bool !64BIT | ||||
|  |  | |||
|  | @ -21,4 +21,5 @@ generic-y += div64.h | |||
| generic-y += local64.h | ||||
| generic-y += irq_regs.h | ||||
| generic-y += local.h | ||||
| generic-y += module.h | ||||
| generic-y += word-at-a-time.h | ||||
|  |  | |||
|  | @ -1,24 +0,0 @@ | |||
| #ifndef __SPARC_MODULE_H | ||||
| #define __SPARC_MODULE_H | ||||
| struct mod_arch_specific { }; | ||||
| 
 | ||||
| /*
 | ||||
|  * Use some preprocessor magic to define the correct symbol | ||||
|  * for sparc32 and sparc64. | ||||
|  * Elf_Addr becomes Elf32_Addr for sparc32 and Elf64_Addr for sparc64 | ||||
|  */ | ||||
| #define ___ELF(a, b, c) a##b##c | ||||
| #define __ELF(a, b, c)  ___ELF(a, b, c) | ||||
| #define  _Elf(t)        __ELF(Elf, CONFIG_BITS, t) | ||||
| #define  _ELF(t)        __ELF(ELF, CONFIG_BITS, t) | ||||
| 
 | ||||
| #define Elf_Shdr     _Elf(_Shdr) | ||||
| #define Elf_Sym      _Elf(_Sym) | ||||
| #define Elf_Ehdr     _Elf(_Ehdr) | ||||
| #define Elf_Rela     _Elf(_Rela) | ||||
| #define Elf_Addr     _Elf(_Addr) | ||||
| 
 | ||||
| #define ELF_R_SYM    _ELF(_R_SYM) | ||||
| #define ELF_R_TYPE   _ELF(_R_TYPE) | ||||
| 
 | ||||
| #endif /* __SPARC_MODULE_H */ | ||||
|  | @ -17,6 +17,7 @@ config TILE | |||
| 	select SYS_HYPERVISOR | ||||
| 	select ARCH_HAVE_NMI_SAFE_CMPXCHG | ||||
| 	select GENERIC_CLOCKEVENTS | ||||
| 	select MODULES_USE_ELF_RELA | ||||
| 
 | ||||
| # FIXME: investigate whether we need/want these options. | ||||
| #	select HAVE_IOREMAP_PROT | ||||
|  |  | |||
|  | @ -14,6 +14,7 @@ config UNICORE32 | |||
| 	select GENERIC_IRQ_SHOW | ||||
| 	select ARCH_WANT_FRAME_POINTERS | ||||
| 	select GENERIC_IOMAP | ||||
| 	select MODULES_USE_ELF_REL | ||||
| 	help | ||||
| 	  UniCore-32 is 32-bit Instruction Set Architecture, | ||||
| 	  including a series of low-power-consumption RISC chip | ||||
|  |  | |||
|  | @ -97,6 +97,8 @@ config X86 | |||
| 	select KTIME_SCALAR if X86_32 | ||||
| 	select GENERIC_STRNCPY_FROM_USER | ||||
| 	select GENERIC_STRNLEN_USER | ||||
| 	select MODULES_USE_ELF_REL if X86_32 | ||||
| 	select MODULES_USE_ELF_RELA if X86_64 | ||||
| 
 | ||||
| config INSTRUCTION_DECODER | ||||
| 	def_bool (KPROBES || PERF_EVENTS || UPROBES) | ||||
|  |  | |||
|  | @ -21,9 +21,11 @@ config 64BIT | |||
| config X86_32 | ||||
| 	def_bool !64BIT | ||||
| 	select HAVE_AOUT | ||||
| 	select MODULES_USE_ELF_REL | ||||
| 
 | ||||
| config X86_64 | ||||
| 	def_bool 64BIT | ||||
| 	select MODULES_USE_ELF_RELA | ||||
| 
 | ||||
| config RWSEM_XCHGADD_ALGORITHM | ||||
| 	def_bool X86_XADD && 64BIT | ||||
|  |  | |||
|  | @ -11,6 +11,7 @@ config XTENSA | |||
| 	select HAVE_GENERIC_HARDIRQS | ||||
| 	select GENERIC_IRQ_SHOW | ||||
| 	select GENERIC_CPU_DEVICES | ||||
| 	select MODULES_USE_ELF_RELA | ||||
| 	help | ||||
| 	  Xtensa processors are 32-bit RISC machines designed by Tensilica | ||||
| 	  primarily for embedded systems.  These processors are both | ||||
|  |  | |||
|  | @ -13,15 +13,8 @@ | |||
| #ifndef _XTENSA_MODULE_H | ||||
| #define _XTENSA_MODULE_H | ||||
| 
 | ||||
| struct mod_arch_specific | ||||
| { | ||||
| 	/* No special elements, yet. */ | ||||
| }; | ||||
| 
 | ||||
| #define MODULE_ARCH_VERMAGIC "xtensa-" __stringify(XCHAL_CORE_ID) " " | ||||
| 
 | ||||
| #define Elf_Shdr Elf32_Shdr | ||||
| #define Elf_Sym Elf32_Sym | ||||
| #define Elf_Ehdr Elf32_Ehdr | ||||
| #include <asm-generic/module.h> | ||||
| 
 | ||||
| #endif	/* _XTENSA_MODULE_H */ | ||||
|  |  | |||
|  | @ -5,18 +5,44 @@ | |||
|  * Many architectures just need a simple module | ||||
|  * loader without arch specific data. | ||||
|  */ | ||||
| #ifndef CONFIG_HAVE_MOD_ARCH_SPECIFIC | ||||
| struct mod_arch_specific | ||||
| { | ||||
| }; | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CONFIG_64BIT | ||||
| #define Elf_Shdr	Elf64_Shdr | ||||
| #define Elf_Phdr	Elf64_Phdr | ||||
| #define Elf_Sym		Elf64_Sym | ||||
| #define Elf_Dyn		Elf64_Dyn | ||||
| #define Elf_Ehdr	Elf64_Ehdr | ||||
| #else | ||||
| #define Elf_Addr	Elf64_Addr | ||||
| #ifdef CONFIG_MODULES_USE_ELF_REL | ||||
| #define Elf_Rel		Elf64_Rel | ||||
| #endif | ||||
| #ifdef CONFIG_MODULES_USE_ELF_RELA | ||||
| #define Elf_Rela	Elf64_Rela | ||||
| #endif | ||||
| #define ELF_R_TYPE(X)	ELF64_R_TYPE(X) | ||||
| #define ELF_R_SYM(X)	ELF64_R_SYM(X) | ||||
| 
 | ||||
| #else /* CONFIG_64BIT */ | ||||
| 
 | ||||
| #define Elf_Shdr	Elf32_Shdr | ||||
| #define Elf_Phdr	Elf32_Phdr | ||||
| #define Elf_Sym		Elf32_Sym | ||||
| #define Elf_Dyn		Elf32_Dyn | ||||
| #define Elf_Ehdr	Elf32_Ehdr | ||||
| #define Elf_Addr	Elf32_Addr | ||||
| #ifdef CONFIG_MODULES_USE_ELF_REL | ||||
| #define Elf_Rel		Elf32_Rel | ||||
| #endif | ||||
| #ifdef CONFIG_MODULES_USE_ELF_RELA | ||||
| #define Elf_Rela	Elf32_Rela | ||||
| #endif | ||||
| #define ELF_R_TYPE(X)	ELF32_R_TYPE(X) | ||||
| #define ELF_R_SYM(X)	ELF32_R_SYM(X) | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __ASM_GENERIC_MODULE_H */ | ||||
|  |  | |||
|  | @ -28,21 +28,49 @@ void *module_alloc(unsigned long size); | |||
| /* Free memory returned from module_alloc. */ | ||||
| void module_free(struct module *mod, void *module_region); | ||||
| 
 | ||||
| /* Apply the given relocation to the (simplified) ELF.  Return -error
 | ||||
|    or 0. */ | ||||
| /*
 | ||||
|  * Apply the given relocation to the (simplified) ELF.  Return -error | ||||
|  * or 0. | ||||
|  */ | ||||
| #ifdef CONFIG_MODULES_USE_ELF_REL | ||||
| int apply_relocate(Elf_Shdr *sechdrs, | ||||
| 		   const char *strtab, | ||||
| 		   unsigned int symindex, | ||||
| 		   unsigned int relsec, | ||||
| 		   struct module *mod); | ||||
| #else | ||||
| static inline int apply_relocate(Elf_Shdr *sechdrs, | ||||
| 				 const char *strtab, | ||||
| 				 unsigned int symindex, | ||||
| 				 unsigned int relsec, | ||||
| 				 struct module *me) | ||||
| { | ||||
| 	printk(KERN_ERR "module %s: REL relocation unsupported\n", me->name); | ||||
| 	return -ENOEXEC; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| /* Apply the given add relocation to the (simplified) ELF.  Return
 | ||||
|    -error or 0 */ | ||||
| /*
 | ||||
|  * Apply the given add relocation to the (simplified) ELF.  Return | ||||
|  * -error or 0 | ||||
|  */ | ||||
| #ifdef CONFIG_MODULES_USE_ELF_RELA | ||||
| int apply_relocate_add(Elf_Shdr *sechdrs, | ||||
| 		       const char *strtab, | ||||
| 		       unsigned int symindex, | ||||
| 		       unsigned int relsec, | ||||
| 		       struct module *mod); | ||||
| #else | ||||
| static inline int apply_relocate_add(Elf_Shdr *sechdrs, | ||||
| 				     const char *strtab, | ||||
| 				     unsigned int symindex, | ||||
| 				     unsigned int relsec, | ||||
| 				     struct module *me) | ||||
| { | ||||
| 	printk(KERN_ERR "module %s: REL relocation unsupported\n", me->name); | ||||
| 	return -ENOEXEC; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| /* Any final processing of module before access.  Return -error or 0. */ | ||||
| int module_finalize(const Elf_Ehdr *hdr, | ||||
|  |  | |||
|  | @ -1949,26 +1949,6 @@ static int simplify_symbols(struct module *mod, const struct load_info *info) | |||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| int __weak apply_relocate(Elf_Shdr *sechdrs, | ||||
| 			  const char *strtab, | ||||
| 			  unsigned int symindex, | ||||
| 			  unsigned int relsec, | ||||
| 			  struct module *me) | ||||
| { | ||||
| 	pr_err("module %s: REL relocation unsupported\n", me->name); | ||||
| 	return -ENOEXEC; | ||||
| } | ||||
| 
 | ||||
| int __weak apply_relocate_add(Elf_Shdr *sechdrs, | ||||
| 			      const char *strtab, | ||||
| 			      unsigned int symindex, | ||||
| 			      unsigned int relsec, | ||||
| 			      struct module *me) | ||||
| { | ||||
| 	pr_err("module %s: RELA relocation unsupported\n", me->name); | ||||
| 	return -ENOEXEC; | ||||
| } | ||||
| 
 | ||||
| static int apply_relocations(struct module *mod, const struct load_info *info) | ||||
| { | ||||
| 	unsigned int i; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 David Howells
				David Howells