1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _LINUX_MODULELOADER_H 3 #define _LINUX_MODULELOADER_H 4 /* The stuff needed for archs to support modules. */ 5 6 #include <linux/module.h> 7 #include <linux/elf.h> 8 9 /* These may be implemented by architectures that need to hook into the 10 * module loader code. Architectures that don't need to do anything special 11 * can just rely on the 'weak' default hooks defined in kernel/module.c. 12 * Note, however, that at least one of apply_relocate or apply_relocate_add 13 * must be implemented by each architecture. 14 */ 15 16 /* Adjust arch-specific sections. Return 0 on success. */ 17 int module_frob_arch_sections(Elf_Ehdr *hdr, 18 Elf_Shdr *sechdrs, 19 char *secstrings, 20 struct module *mod); 21 22 /* Additional bytes needed by arch in front of individual sections */ 23 unsigned int arch_mod_section_prepend(struct module *mod, unsigned int section); 24 25 /* Allocator used for allocating struct module, core sections and init 26 sections. Returns NULL on failure. */ 27 void *module_alloc(unsigned long size); 28 29 /* Free memory returned from module_alloc. */ 30 void module_memfree(void *module_region); 31 32 /* 33 * Apply the given relocation to the (simplified) ELF. Return -error 34 * or 0. 35 */ 36 #ifdef CONFIG_MODULES_USE_ELF_REL 37 int apply_relocate(Elf_Shdr *sechdrs, 38 const char *strtab, 39 unsigned int symindex, 40 unsigned int relsec, 41 struct module *mod); 42 #else 43 static inline int apply_relocate(Elf_Shdr *sechdrs, 44 const char *strtab, 45 unsigned int symindex, 46 unsigned int relsec, 47 struct module *me) 48 { 49 printk(KERN_ERR "module %s: REL relocation unsupported\n", 50 module_name(me)); 51 return -ENOEXEC; 52 } 53 #endif 54 55 /* 56 * Apply the given add relocation to the (simplified) ELF. Return 57 * -error or 0 58 */ 59 #ifdef CONFIG_MODULES_USE_ELF_RELA 60 int apply_relocate_add(Elf_Shdr *sechdrs, 61 const char *strtab, 62 unsigned int symindex, 63 unsigned int relsec, 64 struct module *mod); 65 #else 66 static inline int apply_relocate_add(Elf_Shdr *sechdrs, 67 const char *strtab, 68 unsigned int symindex, 69 unsigned int relsec, 70 struct module *me) 71 { 72 printk(KERN_ERR "module %s: REL relocation unsupported\n", 73 module_name(me)); 74 return -ENOEXEC; 75 } 76 #endif 77 78 /* Any final processing of module before access. Return -error or 0. */ 79 int module_finalize(const Elf_Ehdr *hdr, 80 const Elf_Shdr *sechdrs, 81 struct module *mod); 82 83 /* Any cleanup needed when module leaves. */ 84 void module_arch_cleanup(struct module *mod); 85 86 /* Any cleanup before freeing mod->module_init */ 87 void module_arch_freeing_init(struct module *mod); 88 89 #ifdef CONFIG_KASAN 90 #include <linux/kasan.h> 91 #define MODULE_ALIGN (PAGE_SIZE << KASAN_SHADOW_SCALE_SHIFT) 92 #else 93 #define MODULE_ALIGN PAGE_SIZE 94 #endif 95 96 #endif 97