Blame view

include/linux/moduleloader.h 2.87 KB
d7d243b52   Eric Lee   SMARC-iMX8MQ Linu...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
  /* SPDX-License-Identifier: GPL-2.0 */
  #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_memfree(void *module_region);
  
  /* Determines if the section name is an exit section (that is only used during
   * module unloading)
   */
  bool module_exit_section(const char *name);
  
  /*
   * 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
  ",
  	       module_name(me));
  	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
  ",
  	       module_name(me));
  	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);
  
  /* Any cleanup before freeing mod->module_init */
  void module_arch_freeing_init(struct module *mod);
  
  #ifdef CONFIG_KASAN
  #include <linux/kasan.h>
  #define MODULE_ALIGN (PAGE_SIZE << KASAN_SHADOW_SCALE_SHIFT)
  #else
  #define MODULE_ALIGN PAGE_SIZE
  #endif
  
  #endif