at v4.20-rc7 2.8 kB view raw
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. */ 17int 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 */ 23unsigned 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. */ 27void *module_alloc(unsigned long size); 28 29/* Free memory returned from module_alloc. */ 30void 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 37int apply_relocate(Elf_Shdr *sechdrs, 38 const char *strtab, 39 unsigned int symindex, 40 unsigned int relsec, 41 struct module *mod); 42#else 43static 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 60int apply_relocate_add(Elf_Shdr *sechdrs, 61 const char *strtab, 62 unsigned int symindex, 63 unsigned int relsec, 64 struct module *mod); 65#else 66static 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. */ 79int module_finalize(const Elf_Ehdr *hdr, 80 const Elf_Shdr *sechdrs, 81 struct module *mod); 82 83/* Any cleanup needed when module leaves. */ 84void module_arch_cleanup(struct module *mod); 85 86/* Any cleanup before freeing mod->module_init */ 87void 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