linux/scripts/mod/modpost.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#include <stdio.h>
   3#include <stdlib.h>
   4#include <stdarg.h>
   5#include <string.h>
   6#include <sys/types.h>
   7#include <sys/stat.h>
   8#include <sys/mman.h>
   9#include <fcntl.h>
  10#include <unistd.h>
  11#include <elf.h>
  12
  13#include "elfconfig.h"
  14
  15/* On BSD-alike OSes elf.h defines these according to host's word size */
  16#undef ELF_ST_BIND
  17#undef ELF_ST_TYPE
  18#undef ELF_R_SYM
  19#undef ELF_R_TYPE
  20
  21#if KERNEL_ELFCLASS == ELFCLASS32
  22
  23#define Elf_Ehdr    Elf32_Ehdr
  24#define Elf_Shdr    Elf32_Shdr
  25#define Elf_Sym     Elf32_Sym
  26#define Elf_Addr    Elf32_Addr
  27#define Elf_Sword   Elf64_Sword
  28#define Elf_Section Elf32_Half
  29#define ELF_ST_BIND ELF32_ST_BIND
  30#define ELF_ST_TYPE ELF32_ST_TYPE
  31
  32#define Elf_Rel     Elf32_Rel
  33#define Elf_Rela    Elf32_Rela
  34#define ELF_R_SYM   ELF32_R_SYM
  35#define ELF_R_TYPE  ELF32_R_TYPE
  36#else
  37
  38#define Elf_Ehdr    Elf64_Ehdr
  39#define Elf_Shdr    Elf64_Shdr
  40#define Elf_Sym     Elf64_Sym
  41#define Elf_Addr    Elf64_Addr
  42#define Elf_Sword   Elf64_Sxword
  43#define Elf_Section Elf64_Half
  44#define ELF_ST_BIND ELF64_ST_BIND
  45#define ELF_ST_TYPE ELF64_ST_TYPE
  46
  47#define Elf_Rel     Elf64_Rel
  48#define Elf_Rela    Elf64_Rela
  49#define ELF_R_SYM   ELF64_R_SYM
  50#define ELF_R_TYPE  ELF64_R_TYPE
  51#endif
  52
  53/* The 64-bit MIPS ELF ABI uses an unusual reloc format. */
  54typedef struct
  55{
  56        Elf32_Word    r_sym;    /* Symbol index */
  57        unsigned char r_ssym;   /* Special symbol for 2nd relocation */
  58        unsigned char r_type3;  /* 3rd relocation type */
  59        unsigned char r_type2;  /* 2nd relocation type */
  60        unsigned char r_type1;  /* 1st relocation type */
  61} _Elf64_Mips_R_Info;
  62
  63typedef union
  64{
  65        Elf64_Xword             r_info_number;
  66        _Elf64_Mips_R_Info      r_info_fields;
  67} _Elf64_Mips_R_Info_union;
  68
  69#define ELF64_MIPS_R_SYM(i) \
  70  ((__extension__ (_Elf64_Mips_R_Info_union)(i)).r_info_fields.r_sym)
  71
  72#define ELF64_MIPS_R_TYPE(i) \
  73  ((__extension__ (_Elf64_Mips_R_Info_union)(i)).r_info_fields.r_type1)
  74
  75#if KERNEL_ELFDATA != HOST_ELFDATA
  76
  77static inline void __endian(const void *src, void *dest, unsigned int size)
  78{
  79        unsigned int i;
  80        for (i = 0; i < size; i++)
  81                ((unsigned char*)dest)[i] = ((unsigned char*)src)[size - i-1];
  82}
  83
  84#define TO_NATIVE(x)                                            \
  85({                                                              \
  86        typeof(x) __x;                                          \
  87        __endian(&(x), &(__x), sizeof(__x));                    \
  88        __x;                                                    \
  89})
  90
  91#else /* endianness matches */
  92
  93#define TO_NATIVE(x) (x)
  94
  95#endif
  96
  97#define NOFAIL(ptr)   do_nofail((ptr), #ptr)
  98void *do_nofail(void *ptr, const char *expr);
  99
 100struct buffer {
 101        char *p;
 102        int pos;
 103        int size;
 104};
 105
 106void __attribute__((format(printf, 2, 3)))
 107buf_printf(struct buffer *buf, const char *fmt, ...);
 108
 109void
 110buf_write(struct buffer *buf, const char *s, int len);
 111
 112struct namespace_list {
 113        struct namespace_list *next;
 114        char namespace[];
 115};
 116
 117struct module {
 118        struct module *next;
 119        int gpl_compatible;
 120        struct symbol *unres;
 121        int from_dump;  /* 1 if module was loaded from *.symvers */
 122        int is_vmlinux;
 123        int seen;
 124        int has_init;
 125        int has_cleanup;
 126        struct buffer dev_table_buf;
 127        char         srcversion[25];
 128        // Missing namespace dependencies
 129        struct namespace_list *missing_namespaces;
 130        // Actual imported namespaces
 131        struct namespace_list *imported_namespaces;
 132        char name[];
 133};
 134
 135struct elf_info {
 136        size_t size;
 137        Elf_Ehdr     *hdr;
 138        Elf_Shdr     *sechdrs;
 139        Elf_Sym      *symtab_start;
 140        Elf_Sym      *symtab_stop;
 141        Elf_Section  export_sec;
 142        Elf_Section  export_gpl_sec;
 143        char         *strtab;
 144        char         *modinfo;
 145        unsigned int modinfo_len;
 146
 147        /* support for 32bit section numbers */
 148
 149        unsigned int num_sections; /* max_secindex + 1 */
 150        unsigned int secindex_strings;
 151        /* if Nth symbol table entry has .st_shndx = SHN_XINDEX,
 152         * take shndx from symtab_shndx_start[N] instead */
 153        Elf32_Word   *symtab_shndx_start;
 154        Elf32_Word   *symtab_shndx_stop;
 155};
 156
 157static inline int is_shndx_special(unsigned int i)
 158{
 159        return i != SHN_XINDEX && i >= SHN_LORESERVE && i <= SHN_HIRESERVE;
 160}
 161
 162/*
 163 * Move reserved section indices SHN_LORESERVE..SHN_HIRESERVE out of
 164 * the way to -256..-1, to avoid conflicting with real section
 165 * indices.
 166 */
 167#define SPECIAL(i) ((i) - (SHN_HIRESERVE + 1))
 168
 169/* Accessor for sym->st_shndx, hides ugliness of "64k sections" */
 170static inline unsigned int get_secindex(const struct elf_info *info,
 171                                        const Elf_Sym *sym)
 172{
 173        if (is_shndx_special(sym->st_shndx))
 174                return SPECIAL(sym->st_shndx);
 175        if (sym->st_shndx != SHN_XINDEX)
 176                return sym->st_shndx;
 177        return info->symtab_shndx_start[sym - info->symtab_start];
 178}
 179
 180/* file2alias.c */
 181extern unsigned int cross_build;
 182void handle_moddevtable(struct module *mod, struct elf_info *info,
 183                        Elf_Sym *sym, const char *symname);
 184void add_moddevtable(struct buffer *buf, struct module *mod);
 185
 186/* sumversion.c */
 187void get_src_version(const char *modname, char sum[], unsigned sumlen);
 188
 189/* from modpost.c */
 190char *read_text_file(const char *filename);
 191char *get_line(char **stringp);
 192
 193enum loglevel {
 194        LOG_WARN,
 195        LOG_ERROR,
 196        LOG_FATAL
 197};
 198
 199void modpost_log(enum loglevel loglevel, const char *fmt, ...);
 200
 201/*
 202 * warn - show the given message, then let modpost continue running, still
 203 *        allowing modpost to exit successfully. This should be used when
 204 *        we still allow to generate vmlinux and modules.
 205 *
 206 * error - show the given message, then let modpost continue running, but fail
 207 *         in the end. This should be used when we should stop building vmlinux
 208 *         or modules, but we can continue running modpost to catch as many
 209 *         issues as possible.
 210 *
 211 * fatal - show the given message, and bail out immediately. This should be
 212 *         used when there is no point to continue running modpost.
 213 */
 214#define warn(fmt, args...)      modpost_log(LOG_WARN, fmt, ##args)
 215#define error(fmt, args...)     modpost_log(LOG_ERROR, fmt, ##args)
 216#define fatal(fmt, args...)     modpost_log(LOG_FATAL, fmt, ##args)
 217