linux/include/linux/moduleloader.h
<<
>>
Prefs
   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/* Determines if the section name is an init section (that is only used during
  33 * module loading).
  34 */
  35bool module_init_section(const char *name);
  36
  37/* Determines if the section name is an exit section (that is only used during
  38 * module unloading)
  39 */
  40bool module_exit_section(const char *name);
  41
  42/*
  43 * Apply the given relocation to the (simplified) ELF.  Return -error
  44 * or 0.
  45 */
  46#ifdef CONFIG_MODULES_USE_ELF_REL
  47int apply_relocate(Elf_Shdr *sechdrs,
  48                   const char *strtab,
  49                   unsigned int symindex,
  50                   unsigned int relsec,
  51                   struct module *mod);
  52#else
  53static inline int apply_relocate(Elf_Shdr *sechdrs,
  54                                 const char *strtab,
  55                                 unsigned int symindex,
  56                                 unsigned int relsec,
  57                                 struct module *me)
  58{
  59        printk(KERN_ERR "module %s: REL relocation unsupported\n",
  60               module_name(me));
  61        return -ENOEXEC;
  62}
  63#endif
  64
  65/*
  66 * Apply the given add relocation to the (simplified) ELF.  Return
  67 * -error or 0
  68 */
  69#ifdef CONFIG_MODULES_USE_ELF_RELA
  70int apply_relocate_add(Elf_Shdr *sechdrs,
  71                       const char *strtab,
  72                       unsigned int symindex,
  73                       unsigned int relsec,
  74                       struct module *mod);
  75#else
  76static inline int apply_relocate_add(Elf_Shdr *sechdrs,
  77                                     const char *strtab,
  78                                     unsigned int symindex,
  79                                     unsigned int relsec,
  80                                     struct module *me)
  81{
  82        printk(KERN_ERR "module %s: REL relocation unsupported\n",
  83               module_name(me));
  84        return -ENOEXEC;
  85}
  86#endif
  87
  88/* Any final processing of module before access.  Return -error or 0. */
  89int module_finalize(const Elf_Ehdr *hdr,
  90                    const Elf_Shdr *sechdrs,
  91                    struct module *mod);
  92
  93/* Any cleanup needed when module leaves. */
  94void module_arch_cleanup(struct module *mod);
  95
  96/* Any cleanup before freeing mod->module_init */
  97void module_arch_freeing_init(struct module *mod);
  98
  99#if (defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)) && \
 100                !defined(CONFIG_KASAN_VMALLOC)
 101#include <linux/kasan.h>
 102#define MODULE_ALIGN (PAGE_SIZE << KASAN_SHADOW_SCALE_SHIFT)
 103#else
 104#define MODULE_ALIGN PAGE_SIZE
 105#endif
 106
 107#endif
 108