xref: /linux-6.15/include/linux/moduleloader.h (revision 1da177e4)
1*1da177e4SLinus Torvalds #ifndef _LINUX_MODULELOADER_H
2*1da177e4SLinus Torvalds #define _LINUX_MODULELOADER_H
3*1da177e4SLinus Torvalds /* The stuff needed for archs to support modules. */
4*1da177e4SLinus Torvalds 
5*1da177e4SLinus Torvalds #include <linux/module.h>
6*1da177e4SLinus Torvalds #include <linux/elf.h>
7*1da177e4SLinus Torvalds 
8*1da177e4SLinus Torvalds /* These must be implemented by the specific architecture */
9*1da177e4SLinus Torvalds 
10*1da177e4SLinus Torvalds /* Adjust arch-specific sections.  Return 0 on success.  */
11*1da177e4SLinus Torvalds int module_frob_arch_sections(Elf_Ehdr *hdr,
12*1da177e4SLinus Torvalds 			      Elf_Shdr *sechdrs,
13*1da177e4SLinus Torvalds 			      char *secstrings,
14*1da177e4SLinus Torvalds 			      struct module *mod);
15*1da177e4SLinus Torvalds 
16*1da177e4SLinus Torvalds /* Allocator used for allocating struct module, core sections and init
17*1da177e4SLinus Torvalds    sections.  Returns NULL on failure. */
18*1da177e4SLinus Torvalds void *module_alloc(unsigned long size);
19*1da177e4SLinus Torvalds 
20*1da177e4SLinus Torvalds /* Free memory returned from module_alloc. */
21*1da177e4SLinus Torvalds void module_free(struct module *mod, void *module_region);
22*1da177e4SLinus Torvalds 
23*1da177e4SLinus Torvalds /* Apply the given relocation to the (simplified) ELF.  Return -error
24*1da177e4SLinus Torvalds    or 0. */
25*1da177e4SLinus Torvalds int apply_relocate(Elf_Shdr *sechdrs,
26*1da177e4SLinus Torvalds 		   const char *strtab,
27*1da177e4SLinus Torvalds 		   unsigned int symindex,
28*1da177e4SLinus Torvalds 		   unsigned int relsec,
29*1da177e4SLinus Torvalds 		   struct module *mod);
30*1da177e4SLinus Torvalds 
31*1da177e4SLinus Torvalds /* Apply the given add relocation to the (simplified) ELF.  Return
32*1da177e4SLinus Torvalds    -error or 0 */
33*1da177e4SLinus Torvalds int apply_relocate_add(Elf_Shdr *sechdrs,
34*1da177e4SLinus Torvalds 		       const char *strtab,
35*1da177e4SLinus Torvalds 		       unsigned int symindex,
36*1da177e4SLinus Torvalds 		       unsigned int relsec,
37*1da177e4SLinus Torvalds 		       struct module *mod);
38*1da177e4SLinus Torvalds 
39*1da177e4SLinus Torvalds /* Any final processing of module before access.  Return -error or 0. */
40*1da177e4SLinus Torvalds int module_finalize(const Elf_Ehdr *hdr,
41*1da177e4SLinus Torvalds 		    const Elf_Shdr *sechdrs,
42*1da177e4SLinus Torvalds 		    struct module *mod);
43*1da177e4SLinus Torvalds 
44*1da177e4SLinus Torvalds /* Any cleanup needed when module leaves. */
45*1da177e4SLinus Torvalds void module_arch_cleanup(struct module *mod);
46*1da177e4SLinus Torvalds 
47*1da177e4SLinus Torvalds #endif
48