forked from mirrors/linux
		
	 786d35d45c
			
		
	
	
		786d35d45c
		
	
	
	
	
		
			
			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>
		
	
			
		
			
				
	
	
		
			83 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef _LINUX_MODULELOADER_H
 | |
| #define _LINUX_MODULELOADER_H
 | |
| /* The stuff needed for archs to support modules. */
 | |
| 
 | |
| #include <linux/module.h>
 | |
| #include <linux/elf.h>
 | |
| 
 | |
| /* These may be implemented by architectures that need to hook into the
 | |
|  * module loader code.  Architectures that don't need to do anything special
 | |
|  * can just rely on the 'weak' default hooks defined in kernel/module.c.
 | |
|  * Note, however, that at least one of apply_relocate or apply_relocate_add
 | |
|  * must be implemented by each architecture.
 | |
|  */
 | |
| 
 | |
| /* Adjust arch-specific sections.  Return 0 on success.  */
 | |
| int module_frob_arch_sections(Elf_Ehdr *hdr,
 | |
| 			      Elf_Shdr *sechdrs,
 | |
| 			      char *secstrings,
 | |
| 			      struct module *mod);
 | |
| 
 | |
| /* Additional bytes needed by arch in front of individual sections */
 | |
| unsigned int arch_mod_section_prepend(struct module *mod, unsigned int section);
 | |
| 
 | |
| /* Allocator used for allocating struct module, core sections and init
 | |
|    sections.  Returns NULL on failure. */
 | |
| 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.
 | |
|  */
 | |
| #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
 | |
|  */
 | |
| #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,
 | |
| 		    const Elf_Shdr *sechdrs,
 | |
| 		    struct module *mod);
 | |
| 
 | |
| /* Any cleanup needed when module leaves. */
 | |
| void module_arch_cleanup(struct module *mod);
 | |
| 
 | |
| #endif
 |