linux/scripts/mod/modpost.c
<<
>>
Prefs
   1/* Postprocess module symbol versions
   2 *
   3 * Copyright 2003       Kai Germaschewski
   4 * Copyright 2002-2004  Rusty Russell, IBM Corporation
   5 * Copyright 2006-2008  Sam Ravnborg
   6 * Based in part on module-init-tools/depmod.c,file2alias
   7 *
   8 * This software may be used and distributed according to the terms
   9 * of the GNU General Public License, incorporated herein by reference.
  10 *
  11 * Usage: modpost vmlinux module1.o module2.o ...
  12 */
  13
  14#define _GNU_SOURCE
  15#include <stdio.h>
  16#include <ctype.h>
  17#include <string.h>
  18#include <limits.h>
  19#include <stdbool.h>
  20#include <errno.h>
  21#include "modpost.h"
  22#include "../../include/generated/autoconf.h"
  23#include "../../include/linux/license.h"
  24#include "../../include/linux/export.h"
  25
  26/* Are we using CONFIG_MODVERSIONS? */
  27static int modversions = 0;
  28/* Warn about undefined symbols? (do so if we have vmlinux) */
  29static int have_vmlinux = 0;
  30/* Is CONFIG_MODULE_SRCVERSION_ALL set? */
  31static int all_versions = 0;
  32/* If we are modposting external module set to 1 */
  33static int external_module = 0;
  34/* Warn about section mismatch in vmlinux if set to 1 */
  35static int vmlinux_section_warnings = 1;
  36/* Only warn about unresolved symbols */
  37static int warn_unresolved = 0;
  38/* How a symbol is exported */
  39static int sec_mismatch_count = 0;
  40static int sec_mismatch_verbose = 1;
  41static int sec_mismatch_fatal = 0;
  42/* ignore missing files */
  43static int ignore_missing_files;
  44
  45enum export {
  46        export_plain,      export_unused,     export_gpl,
  47        export_unused_gpl, export_gpl_future, export_unknown
  48};
  49
  50#define PRINTF __attribute__ ((format (printf, 1, 2)))
  51
  52PRINTF void fatal(const char *fmt, ...)
  53{
  54        va_list arglist;
  55
  56        fprintf(stderr, "FATAL: ");
  57
  58        va_start(arglist, fmt);
  59        vfprintf(stderr, fmt, arglist);
  60        va_end(arglist);
  61
  62        exit(1);
  63}
  64
  65PRINTF void warn(const char *fmt, ...)
  66{
  67        va_list arglist;
  68
  69        fprintf(stderr, "WARNING: ");
  70
  71        va_start(arglist, fmt);
  72        vfprintf(stderr, fmt, arglist);
  73        va_end(arglist);
  74}
  75
  76PRINTF void merror(const char *fmt, ...)
  77{
  78        va_list arglist;
  79
  80        fprintf(stderr, "ERROR: ");
  81
  82        va_start(arglist, fmt);
  83        vfprintf(stderr, fmt, arglist);
  84        va_end(arglist);
  85}
  86
  87static inline bool strends(const char *str, const char *postfix)
  88{
  89        if (strlen(str) < strlen(postfix))
  90                return false;
  91
  92        return strcmp(str + strlen(str) - strlen(postfix), postfix) == 0;
  93}
  94
  95static int is_vmlinux(const char *modname)
  96{
  97        const char *myname;
  98
  99        myname = strrchr(modname, '/');
 100        if (myname)
 101                myname++;
 102        else
 103                myname = modname;
 104
 105        return (strcmp(myname, "vmlinux") == 0) ||
 106               (strcmp(myname, "vmlinux.o") == 0);
 107}
 108
 109void *do_nofail(void *ptr, const char *expr)
 110{
 111        if (!ptr)
 112                fatal("modpost: Memory allocation failure: %s.\n", expr);
 113
 114        return ptr;
 115}
 116
 117/* A list of all modules we processed */
 118static struct module *modules;
 119
 120static struct module *find_module(char *modname)
 121{
 122        struct module *mod;
 123
 124        for (mod = modules; mod; mod = mod->next)
 125                if (strcmp(mod->name, modname) == 0)
 126                        break;
 127        return mod;
 128}
 129
 130static struct module *new_module(const char *modname)
 131{
 132        struct module *mod;
 133        char *p;
 134
 135        mod = NOFAIL(malloc(sizeof(*mod)));
 136        memset(mod, 0, sizeof(*mod));
 137        p = NOFAIL(strdup(modname));
 138
 139        /* strip trailing .o */
 140        if (strends(p, ".o")) {
 141                p[strlen(p) - 2] = '\0';
 142                mod->is_dot_o = 1;
 143        }
 144
 145        /* add to list */
 146        mod->name = p;
 147        mod->gpl_compatible = -1;
 148        mod->next = modules;
 149        modules = mod;
 150
 151        return mod;
 152}
 153
 154/* A hash of all exported symbols,
 155 * struct symbol is also used for lists of unresolved symbols */
 156
 157#define SYMBOL_HASH_SIZE 1024
 158
 159struct symbol {
 160        struct symbol *next;
 161        struct module *module;
 162        unsigned int crc;
 163        int crc_valid;
 164        unsigned int weak:1;
 165        unsigned int vmlinux:1;    /* 1 if symbol is defined in vmlinux */
 166        unsigned int kernel:1;     /* 1 if symbol is from kernel
 167                                    *  (only for external modules) **/
 168        unsigned int preloaded:1;  /* 1 if symbol from Module.symvers, or crc */
 169        enum export  export;       /* Type of export */
 170        char name[0];
 171};
 172
 173static struct symbol *symbolhash[SYMBOL_HASH_SIZE];
 174
 175/* This is based on the hash agorithm from gdbm, via tdb */
 176static inline unsigned int tdb_hash(const char *name)
 177{
 178        unsigned value; /* Used to compute the hash value.  */
 179        unsigned   i;   /* Used to cycle through random values. */
 180
 181        /* Set the initial value from the key size. */
 182        for (value = 0x238F13AF * strlen(name), i = 0; name[i]; i++)
 183                value = (value + (((unsigned char *)name)[i] << (i*5 % 24)));
 184
 185        return (1103515243 * value + 12345);
 186}
 187
 188/**
 189 * Allocate a new symbols for use in the hash of exported symbols or
 190 * the list of unresolved symbols per module
 191 **/
 192static struct symbol *alloc_symbol(const char *name, unsigned int weak,
 193                                   struct symbol *next)
 194{
 195        struct symbol *s = NOFAIL(malloc(sizeof(*s) + strlen(name) + 1));
 196
 197        memset(s, 0, sizeof(*s));
 198        strcpy(s->name, name);
 199        s->weak = weak;
 200        s->next = next;
 201        return s;
 202}
 203
 204/* For the hash of exported symbols */
 205static struct symbol *new_symbol(const char *name, struct module *module,
 206                                 enum export export)
 207{
 208        unsigned int hash;
 209        struct symbol *new;
 210
 211        hash = tdb_hash(name) % SYMBOL_HASH_SIZE;
 212        new = symbolhash[hash] = alloc_symbol(name, 0, symbolhash[hash]);
 213        new->module = module;
 214        new->export = export;
 215        return new;
 216}
 217
 218static struct symbol *find_symbol(const char *name)
 219{
 220        struct symbol *s;
 221
 222        /* For our purposes, .foo matches foo.  PPC64 needs this. */
 223        if (name[0] == '.')
 224                name++;
 225
 226        for (s = symbolhash[tdb_hash(name) % SYMBOL_HASH_SIZE]; s; s = s->next) {
 227                if (strcmp(s->name, name) == 0)
 228                        return s;
 229        }
 230        return NULL;
 231}
 232
 233static const struct {
 234        const char *str;
 235        enum export export;
 236} export_list[] = {
 237        { .str = "EXPORT_SYMBOL",            .export = export_plain },
 238        { .str = "EXPORT_UNUSED_SYMBOL",     .export = export_unused },
 239        { .str = "EXPORT_SYMBOL_GPL",        .export = export_gpl },
 240        { .str = "EXPORT_UNUSED_SYMBOL_GPL", .export = export_unused_gpl },
 241        { .str = "EXPORT_SYMBOL_GPL_FUTURE", .export = export_gpl_future },
 242        { .str = "(unknown)",                .export = export_unknown },
 243};
 244
 245
 246static const char *export_str(enum export ex)
 247{
 248        return export_list[ex].str;
 249}
 250
 251static enum export export_no(const char *s)
 252{
 253        int i;
 254
 255        if (!s)
 256                return export_unknown;
 257        for (i = 0; export_list[i].export != export_unknown; i++) {
 258                if (strcmp(export_list[i].str, s) == 0)
 259                        return export_list[i].export;
 260        }
 261        return export_unknown;
 262}
 263
 264static const char *sec_name(struct elf_info *elf, int secindex);
 265
 266#define strstarts(str, prefix) (strncmp(str, prefix, strlen(prefix)) == 0)
 267
 268static enum export export_from_secname(struct elf_info *elf, unsigned int sec)
 269{
 270        const char *secname = sec_name(elf, sec);
 271
 272        if (strstarts(secname, "___ksymtab+"))
 273                return export_plain;
 274        else if (strstarts(secname, "___ksymtab_unused+"))
 275                return export_unused;
 276        else if (strstarts(secname, "___ksymtab_gpl+"))
 277                return export_gpl;
 278        else if (strstarts(secname, "___ksymtab_unused_gpl+"))
 279                return export_unused_gpl;
 280        else if (strstarts(secname, "___ksymtab_gpl_future+"))
 281                return export_gpl_future;
 282        else
 283                return export_unknown;
 284}
 285
 286static enum export export_from_sec(struct elf_info *elf, unsigned int sec)
 287{
 288        if (sec == elf->export_sec)
 289                return export_plain;
 290        else if (sec == elf->export_unused_sec)
 291                return export_unused;
 292        else if (sec == elf->export_gpl_sec)
 293                return export_gpl;
 294        else if (sec == elf->export_unused_gpl_sec)
 295                return export_unused_gpl;
 296        else if (sec == elf->export_gpl_future_sec)
 297                return export_gpl_future;
 298        else
 299                return export_unknown;
 300}
 301
 302/**
 303 * Add an exported symbol - it may have already been added without a
 304 * CRC, in this case just update the CRC
 305 **/
 306static struct symbol *sym_add_exported(const char *name, struct module *mod,
 307                                       enum export export)
 308{
 309        struct symbol *s = find_symbol(name);
 310
 311        if (!s) {
 312                s = new_symbol(name, mod, export);
 313        } else {
 314                if (!s->preloaded) {
 315                        warn("%s: '%s' exported twice. Previous export "
 316                             "was in %s%s\n", mod->name, name,
 317                             s->module->name,
 318                             is_vmlinux(s->module->name) ?"":".ko");
 319                } else {
 320                        /* In case Module.symvers was out of date */
 321                        s->module = mod;
 322                }
 323        }
 324        s->preloaded = 0;
 325        s->vmlinux   = is_vmlinux(mod->name);
 326        s->kernel    = 0;
 327        s->export    = export;
 328        return s;
 329}
 330
 331static void sym_update_crc(const char *name, struct module *mod,
 332                           unsigned int crc, enum export export)
 333{
 334        struct symbol *s = find_symbol(name);
 335
 336        if (!s) {
 337                s = new_symbol(name, mod, export);
 338                /* Don't complain when we find it later. */
 339                s->preloaded = 1;
 340        }
 341        s->crc = crc;
 342        s->crc_valid = 1;
 343}
 344
 345void *grab_file(const char *filename, unsigned long *size)
 346{
 347        struct stat st;
 348        void *map = MAP_FAILED;
 349        int fd;
 350
 351        fd = open(filename, O_RDONLY);
 352        if (fd < 0)
 353                return NULL;
 354        if (fstat(fd, &st))
 355                goto failed;
 356
 357        *size = st.st_size;
 358        map = mmap(NULL, *size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
 359
 360failed:
 361        close(fd);
 362        if (map == MAP_FAILED)
 363                return NULL;
 364        return map;
 365}
 366
 367/**
 368  * Return a copy of the next line in a mmap'ed file.
 369  * spaces in the beginning of the line is trimmed away.
 370  * Return a pointer to a static buffer.
 371  **/
 372char *get_next_line(unsigned long *pos, void *file, unsigned long size)
 373{
 374        static char line[4096];
 375        int skip = 1;
 376        size_t len = 0;
 377        signed char *p = (signed char *)file + *pos;
 378        char *s = line;
 379
 380        for (; *pos < size ; (*pos)++) {
 381                if (skip && isspace(*p)) {
 382                        p++;
 383                        continue;
 384                }
 385                skip = 0;
 386                if (*p != '\n' && (*pos < size)) {
 387                        len++;
 388                        *s++ = *p++;
 389                        if (len > 4095)
 390                                break; /* Too long, stop */
 391                } else {
 392                        /* End of string */
 393                        *s = '\0';
 394                        return line;
 395                }
 396        }
 397        /* End of buffer */
 398        return NULL;
 399}
 400
 401void release_file(void *file, unsigned long size)
 402{
 403        munmap(file, size);
 404}
 405
 406static int parse_elf(struct elf_info *info, const char *filename)
 407{
 408        unsigned int i;
 409        Elf_Ehdr *hdr;
 410        Elf_Shdr *sechdrs;
 411        Elf_Sym  *sym;
 412        const char *secstrings;
 413        unsigned int symtab_idx = ~0U, symtab_shndx_idx = ~0U;
 414
 415        hdr = grab_file(filename, &info->size);
 416        if (!hdr) {
 417                if (ignore_missing_files) {
 418                        fprintf(stderr, "%s: %s (ignored)\n", filename,
 419                                strerror(errno));
 420                        return 0;
 421                }
 422                perror(filename);
 423                exit(1);
 424        }
 425        info->hdr = hdr;
 426        if (info->size < sizeof(*hdr)) {
 427                /* file too small, assume this is an empty .o file */
 428                return 0;
 429        }
 430        /* Is this a valid ELF file? */
 431        if ((hdr->e_ident[EI_MAG0] != ELFMAG0) ||
 432            (hdr->e_ident[EI_MAG1] != ELFMAG1) ||
 433            (hdr->e_ident[EI_MAG2] != ELFMAG2) ||
 434            (hdr->e_ident[EI_MAG3] != ELFMAG3)) {
 435                /* Not an ELF file - silently ignore it */
 436                return 0;
 437        }
 438        /* Fix endianness in ELF header */
 439        hdr->e_type      = TO_NATIVE(hdr->e_type);
 440        hdr->e_machine   = TO_NATIVE(hdr->e_machine);
 441        hdr->e_version   = TO_NATIVE(hdr->e_version);
 442        hdr->e_entry     = TO_NATIVE(hdr->e_entry);
 443        hdr->e_phoff     = TO_NATIVE(hdr->e_phoff);
 444        hdr->e_shoff     = TO_NATIVE(hdr->e_shoff);
 445        hdr->e_flags     = TO_NATIVE(hdr->e_flags);
 446        hdr->e_ehsize    = TO_NATIVE(hdr->e_ehsize);
 447        hdr->e_phentsize = TO_NATIVE(hdr->e_phentsize);
 448        hdr->e_phnum     = TO_NATIVE(hdr->e_phnum);
 449        hdr->e_shentsize = TO_NATIVE(hdr->e_shentsize);
 450        hdr->e_shnum     = TO_NATIVE(hdr->e_shnum);
 451        hdr->e_shstrndx  = TO_NATIVE(hdr->e_shstrndx);
 452        sechdrs = (void *)hdr + hdr->e_shoff;
 453        info->sechdrs = sechdrs;
 454
 455        /* Check if file offset is correct */
 456        if (hdr->e_shoff > info->size) {
 457                fatal("section header offset=%lu in file '%s' is bigger than "
 458                      "filesize=%lu\n", (unsigned long)hdr->e_shoff,
 459                      filename, info->size);
 460                return 0;
 461        }
 462
 463        if (hdr->e_shnum == SHN_UNDEF) {
 464                /*
 465                 * There are more than 64k sections,
 466                 * read count from .sh_size.
 467                 */
 468                info->num_sections = TO_NATIVE(sechdrs[0].sh_size);
 469        }
 470        else {
 471                info->num_sections = hdr->e_shnum;
 472        }
 473        if (hdr->e_shstrndx == SHN_XINDEX) {
 474                info->secindex_strings = TO_NATIVE(sechdrs[0].sh_link);
 475        }
 476        else {
 477                info->secindex_strings = hdr->e_shstrndx;
 478        }
 479
 480        /* Fix endianness in section headers */
 481        for (i = 0; i < info->num_sections; i++) {
 482                sechdrs[i].sh_name      = TO_NATIVE(sechdrs[i].sh_name);
 483                sechdrs[i].sh_type      = TO_NATIVE(sechdrs[i].sh_type);
 484                sechdrs[i].sh_flags     = TO_NATIVE(sechdrs[i].sh_flags);
 485                sechdrs[i].sh_addr      = TO_NATIVE(sechdrs[i].sh_addr);
 486                sechdrs[i].sh_offset    = TO_NATIVE(sechdrs[i].sh_offset);
 487                sechdrs[i].sh_size      = TO_NATIVE(sechdrs[i].sh_size);
 488                sechdrs[i].sh_link      = TO_NATIVE(sechdrs[i].sh_link);
 489                sechdrs[i].sh_info      = TO_NATIVE(sechdrs[i].sh_info);
 490                sechdrs[i].sh_addralign = TO_NATIVE(sechdrs[i].sh_addralign);
 491                sechdrs[i].sh_entsize   = TO_NATIVE(sechdrs[i].sh_entsize);
 492        }
 493        /* Find symbol table. */
 494        secstrings = (void *)hdr + sechdrs[info->secindex_strings].sh_offset;
 495        for (i = 1; i < info->num_sections; i++) {
 496                const char *secname;
 497                int nobits = sechdrs[i].sh_type == SHT_NOBITS;
 498
 499                if (!nobits && sechdrs[i].sh_offset > info->size) {
 500                        fatal("%s is truncated. sechdrs[i].sh_offset=%lu > "
 501                              "sizeof(*hrd)=%zu\n", filename,
 502                              (unsigned long)sechdrs[i].sh_offset,
 503                              sizeof(*hdr));
 504                        return 0;
 505                }
 506                secname = secstrings + sechdrs[i].sh_name;
 507                if (strcmp(secname, ".modinfo") == 0) {
 508                        if (nobits)
 509                                fatal("%s has NOBITS .modinfo\n", filename);
 510                        info->modinfo = (void *)hdr + sechdrs[i].sh_offset;
 511                        info->modinfo_len = sechdrs[i].sh_size;
 512                } else if (strcmp(secname, "__ksymtab") == 0)
 513                        info->export_sec = i;
 514                else if (strcmp(secname, "__ksymtab_unused") == 0)
 515                        info->export_unused_sec = i;
 516                else if (strcmp(secname, "__ksymtab_gpl") == 0)
 517                        info->export_gpl_sec = i;
 518                else if (strcmp(secname, "__ksymtab_unused_gpl") == 0)
 519                        info->export_unused_gpl_sec = i;
 520                else if (strcmp(secname, "__ksymtab_gpl_future") == 0)
 521                        info->export_gpl_future_sec = i;
 522
 523                if (sechdrs[i].sh_type == SHT_SYMTAB) {
 524                        unsigned int sh_link_idx;
 525                        symtab_idx = i;
 526                        info->symtab_start = (void *)hdr +
 527                            sechdrs[i].sh_offset;
 528                        info->symtab_stop  = (void *)hdr +
 529                            sechdrs[i].sh_offset + sechdrs[i].sh_size;
 530                        sh_link_idx = sechdrs[i].sh_link;
 531                        info->strtab       = (void *)hdr +
 532                            sechdrs[sh_link_idx].sh_offset;
 533                }
 534
 535                /* 32bit section no. table? ("more than 64k sections") */
 536                if (sechdrs[i].sh_type == SHT_SYMTAB_SHNDX) {
 537                        symtab_shndx_idx = i;
 538                        info->symtab_shndx_start = (void *)hdr +
 539                            sechdrs[i].sh_offset;
 540                        info->symtab_shndx_stop  = (void *)hdr +
 541                            sechdrs[i].sh_offset + sechdrs[i].sh_size;
 542                }
 543        }
 544        if (!info->symtab_start)
 545                fatal("%s has no symtab?\n", filename);
 546
 547        /* Fix endianness in symbols */
 548        for (sym = info->symtab_start; sym < info->symtab_stop; sym++) {
 549                sym->st_shndx = TO_NATIVE(sym->st_shndx);
 550                sym->st_name  = TO_NATIVE(sym->st_name);
 551                sym->st_value = TO_NATIVE(sym->st_value);
 552                sym->st_size  = TO_NATIVE(sym->st_size);
 553        }
 554
 555        if (symtab_shndx_idx != ~0U) {
 556                Elf32_Word *p;
 557                if (symtab_idx != sechdrs[symtab_shndx_idx].sh_link)
 558                        fatal("%s: SYMTAB_SHNDX has bad sh_link: %u!=%u\n",
 559                              filename, sechdrs[symtab_shndx_idx].sh_link,
 560                              symtab_idx);
 561                /* Fix endianness */
 562                for (p = info->symtab_shndx_start; p < info->symtab_shndx_stop;
 563                     p++)
 564                        *p = TO_NATIVE(*p);
 565        }
 566
 567        return 1;
 568}
 569
 570static void parse_elf_finish(struct elf_info *info)
 571{
 572        release_file(info->hdr, info->size);
 573}
 574
 575static int ignore_undef_symbol(struct elf_info *info, const char *symname)
 576{
 577        /* ignore __this_module, it will be resolved shortly */
 578        if (strcmp(symname, VMLINUX_SYMBOL_STR(__this_module)) == 0)
 579                return 1;
 580        /* ignore global offset table */
 581        if (strcmp(symname, "_GLOBAL_OFFSET_TABLE_") == 0)
 582                return 1;
 583        if (info->hdr->e_machine == EM_PPC)
 584                /* Special register function linked on all modules during final link of .ko */
 585                if (strncmp(symname, "_restgpr_", sizeof("_restgpr_") - 1) == 0 ||
 586                    strncmp(symname, "_savegpr_", sizeof("_savegpr_") - 1) == 0 ||
 587                    strncmp(symname, "_rest32gpr_", sizeof("_rest32gpr_") - 1) == 0 ||
 588                    strncmp(symname, "_save32gpr_", sizeof("_save32gpr_") - 1) == 0 ||
 589                    strncmp(symname, "_restvr_", sizeof("_restvr_") - 1) == 0 ||
 590                    strncmp(symname, "_savevr_", sizeof("_savevr_") - 1) == 0)
 591                        return 1;
 592        if (info->hdr->e_machine == EM_PPC64)
 593                /* Special register function linked on all modules during final link of .ko */
 594                if (strncmp(symname, "_restgpr0_", sizeof("_restgpr0_") - 1) == 0 ||
 595                    strncmp(symname, "_savegpr0_", sizeof("_savegpr0_") - 1) == 0 ||
 596                    strncmp(symname, "_restvr_", sizeof("_restvr_") - 1) == 0 ||
 597                    strncmp(symname, "_savevr_", sizeof("_savevr_") - 1) == 0 ||
 598                    strcmp(symname, ".TOC.") == 0)
 599                        return 1;
 600        /* Do not ignore this symbol */
 601        return 0;
 602}
 603
 604#define CRC_PFX     VMLINUX_SYMBOL_STR(__crc_)
 605#define KSYMTAB_PFX VMLINUX_SYMBOL_STR(__ksymtab_)
 606
 607static void handle_modversions(struct module *mod, struct elf_info *info,
 608                               Elf_Sym *sym, const char *symname)
 609{
 610        unsigned int crc;
 611        enum export export;
 612        bool is_crc = false;
 613
 614        if ((!is_vmlinux(mod->name) || mod->is_dot_o) &&
 615            strncmp(symname, "__ksymtab", 9) == 0)
 616                export = export_from_secname(info, get_secindex(info, sym));
 617        else
 618                export = export_from_sec(info, get_secindex(info, sym));
 619
 620        /* CRC'd symbol */
 621        if (strncmp(symname, CRC_PFX, strlen(CRC_PFX)) == 0) {
 622                is_crc = true;
 623                crc = (unsigned int) sym->st_value;
 624                if (sym->st_shndx != SHN_UNDEF && sym->st_shndx != SHN_ABS) {
 625                        unsigned int *crcp;
 626
 627                        /* symbol points to the CRC in the ELF object */
 628                        crcp = (void *)info->hdr + sym->st_value +
 629                               info->sechdrs[sym->st_shndx].sh_offset -
 630                               (info->hdr->e_type != ET_REL ?
 631                                info->sechdrs[sym->st_shndx].sh_addr : 0);
 632                        crc = *crcp;
 633                }
 634                sym_update_crc(symname + strlen(CRC_PFX), mod, crc,
 635                                export);
 636        }
 637
 638        switch (sym->st_shndx) {
 639        case SHN_COMMON:
 640                if (!strncmp(symname, "__gnu_lto_", sizeof("__gnu_lto_")-1)) {
 641                        /* Should warn here, but modpost runs before the linker */
 642                } else
 643                        warn("\"%s\" [%s] is COMMON symbol\n", symname, mod->name);
 644                break;
 645        case SHN_UNDEF:
 646                /* undefined symbol */
 647                if (ELF_ST_BIND(sym->st_info) != STB_GLOBAL &&
 648                    ELF_ST_BIND(sym->st_info) != STB_WEAK)
 649                        break;
 650                if (ignore_undef_symbol(info, symname))
 651                        break;
 652/* cope with newer glibc (2.3.4 or higher) STT_ definition in elf.h */
 653#if defined(STT_REGISTER) || defined(STT_SPARC_REGISTER)
 654/* add compatibility with older glibc */
 655#ifndef STT_SPARC_REGISTER
 656#define STT_SPARC_REGISTER STT_REGISTER
 657#endif
 658                if (info->hdr->e_machine == EM_SPARC ||
 659                    info->hdr->e_machine == EM_SPARCV9) {
 660                        /* Ignore register directives. */
 661                        if (ELF_ST_TYPE(sym->st_info) == STT_SPARC_REGISTER)
 662                                break;
 663                        if (symname[0] == '.') {
 664                                char *munged = strdup(symname);
 665                                munged[0] = '_';
 666                                munged[1] = toupper(munged[1]);
 667                                symname = munged;
 668                        }
 669                }
 670#endif
 671
 672#ifdef CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX
 673                if (symname[0] != '_')
 674                        break;
 675                else
 676                        symname++;
 677#endif
 678                if (is_crc) {
 679                        const char *e = is_vmlinux(mod->name) ?"":".ko";
 680                        warn("EXPORT symbol \"%s\" [%s%s] version generation failed, symbol will not be versioned.\n", symname + strlen(CRC_PFX), mod->name, e);
 681                }
 682                mod->unres = alloc_symbol(symname,
 683                                          ELF_ST_BIND(sym->st_info) == STB_WEAK,
 684                                          mod->unres);
 685                break;
 686        default:
 687                /* All exported symbols */
 688                if (strncmp(symname, KSYMTAB_PFX, strlen(KSYMTAB_PFX)) == 0) {
 689                        sym_add_exported(symname + strlen(KSYMTAB_PFX), mod,
 690                                        export);
 691                }
 692                if (strcmp(symname, VMLINUX_SYMBOL_STR(init_module)) == 0)
 693                        mod->has_init = 1;
 694                if (strcmp(symname, VMLINUX_SYMBOL_STR(cleanup_module)) == 0)
 695                        mod->has_cleanup = 1;
 696                break;
 697        }
 698}
 699
 700/**
 701 * Parse tag=value strings from .modinfo section
 702 **/
 703static char *next_string(char *string, unsigned long *secsize)
 704{
 705        /* Skip non-zero chars */
 706        while (string[0]) {
 707                string++;
 708                if ((*secsize)-- <= 1)
 709                        return NULL;
 710        }
 711
 712        /* Skip any zero padding. */
 713        while (!string[0]) {
 714                string++;
 715                if ((*secsize)-- <= 1)
 716                        return NULL;
 717        }
 718        return string;
 719}
 720
 721static char *get_next_modinfo(void *modinfo, unsigned long modinfo_len,
 722                              const char *tag, char *info)
 723{
 724        char *p;
 725        unsigned int taglen = strlen(tag);
 726        unsigned long size = modinfo_len;
 727
 728        if (info) {
 729                size -= info - (char *)modinfo;
 730                modinfo = next_string(info, &size);
 731        }
 732
 733        for (p = modinfo; p; p = next_string(p, &size)) {
 734                if (strncmp(p, tag, taglen) == 0 && p[taglen] == '=')
 735                        return p + taglen + 1;
 736        }
 737        return NULL;
 738}
 739
 740static char *get_modinfo(void *modinfo, unsigned long modinfo_len,
 741                         const char *tag)
 742
 743{
 744        return get_next_modinfo(modinfo, modinfo_len, tag, NULL);
 745}
 746
 747/**
 748 * Test if string s ends in string sub
 749 * return 0 if match
 750 **/
 751static int strrcmp(const char *s, const char *sub)
 752{
 753        int slen, sublen;
 754
 755        if (!s || !sub)
 756                return 1;
 757
 758        slen = strlen(s);
 759        sublen = strlen(sub);
 760
 761        if ((slen == 0) || (sublen == 0))
 762                return 1;
 763
 764        if (sublen > slen)
 765                return 1;
 766
 767        return memcmp(s + slen - sublen, sub, sublen);
 768}
 769
 770static const char *sym_name(struct elf_info *elf, Elf_Sym *sym)
 771{
 772        if (sym)
 773                return elf->strtab + sym->st_name;
 774        else
 775                return "(unknown)";
 776}
 777
 778static const char *sec_name(struct elf_info *elf, int secindex)
 779{
 780        Elf_Shdr *sechdrs = elf->sechdrs;
 781        return (void *)elf->hdr +
 782                elf->sechdrs[elf->secindex_strings].sh_offset +
 783                sechdrs[secindex].sh_name;
 784}
 785
 786static const char *sech_name(struct elf_info *elf, Elf_Shdr *sechdr)
 787{
 788        return (void *)elf->hdr +
 789                elf->sechdrs[elf->secindex_strings].sh_offset +
 790                sechdr->sh_name;
 791}
 792
 793/* The pattern is an array of simple patterns.
 794 * "foo" will match an exact string equal to "foo"
 795 * "*foo" will match a string that ends with "foo"
 796 * "foo*" will match a string that begins with "foo"
 797 * "*foo*" will match a string that contains "foo"
 798 */
 799static int match(const char *sym, const char * const pat[])
 800{
 801        const char *p;
 802        while (*pat) {
 803                p = *pat++;
 804                const char *endp = p + strlen(p) - 1;
 805
 806                /* "*foo*" */
 807                if (*p == '*' && *endp == '*') {
 808                        char *here, *bare = strndup(p + 1, strlen(p) - 2);
 809
 810                        here = strstr(sym, bare);
 811                        free(bare);
 812                        if (here != NULL)
 813                                return 1;
 814                }
 815                /* "*foo" */
 816                else if (*p == '*') {
 817                        if (strrcmp(sym, p + 1) == 0)
 818                                return 1;
 819                }
 820                /* "foo*" */
 821                else if (*endp == '*') {
 822                        if (strncmp(sym, p, strlen(p) - 1) == 0)
 823                                return 1;
 824                }
 825                /* no wildcards */
 826                else {
 827                        if (strcmp(p, sym) == 0)
 828                                return 1;
 829                }
 830        }
 831        /* no match */
 832        return 0;
 833}
 834
 835/* sections that we do not want to do full section mismatch check on */
 836static const char *const section_white_list[] =
 837{
 838        ".comment*",
 839        ".debug*",
 840        ".cranges",             /* sh64 */
 841        ".zdebug*",             /* Compressed debug sections. */
 842        ".GCC-command-line",    /* mn10300 */
 843        ".GCC.command.line",    /* record-gcc-switches, non mn10300 */
 844        ".mdebug*",        /* alpha, score, mips etc. */
 845        ".pdr",            /* alpha, score, mips etc. */
 846        ".stab*",
 847        ".note*",
 848        ".got*",
 849        ".toc*",
 850        ".xt.prop",                              /* xtensa */
 851        ".xt.lit",         /* xtensa */
 852        ".arcextmap*",                  /* arc */
 853        ".gnu.linkonce.arcext*",        /* arc : modules */
 854        ".cmem*",                       /* EZchip */
 855        ".fmt_slot*",                   /* EZchip */
 856        ".gnu.lto*",
 857        ".discard.*",
 858        NULL
 859};
 860
 861/*
 862 * This is used to find sections missing the SHF_ALLOC flag.
 863 * The cause of this is often a section specified in assembler
 864 * without "ax" / "aw".
 865 */
 866static void check_section(const char *modname, struct elf_info *elf,
 867                          Elf_Shdr *sechdr)
 868{
 869        const char *sec = sech_name(elf, sechdr);
 870
 871        if (sechdr->sh_type == SHT_PROGBITS &&
 872            !(sechdr->sh_flags & SHF_ALLOC) &&
 873            !match(sec, section_white_list)) {
 874                warn("%s (%s): unexpected non-allocatable section.\n"
 875                     "Did you forget to use \"ax\"/\"aw\" in a .S file?\n"
 876                     "Note that for example <linux/init.h> contains\n"
 877                     "section definitions for use in .S files.\n\n",
 878                     modname, sec);
 879        }
 880}
 881
 882
 883
 884#define ALL_INIT_DATA_SECTIONS \
 885        ".init.setup", ".init.rodata", ".meminit.rodata", \
 886        ".init.data", ".meminit.data"
 887#define ALL_EXIT_DATA_SECTIONS \
 888        ".exit.data", ".memexit.data"
 889
 890#define ALL_INIT_TEXT_SECTIONS \
 891        ".init.text", ".meminit.text"
 892#define ALL_EXIT_TEXT_SECTIONS \
 893        ".exit.text", ".memexit.text"
 894
 895#define ALL_PCI_INIT_SECTIONS   \
 896        ".pci_fixup_early", ".pci_fixup_header", ".pci_fixup_final", \
 897        ".pci_fixup_enable", ".pci_fixup_resume", \
 898        ".pci_fixup_resume_early", ".pci_fixup_suspend"
 899
 900#define ALL_XXXINIT_SECTIONS MEM_INIT_SECTIONS
 901#define ALL_XXXEXIT_SECTIONS MEM_EXIT_SECTIONS
 902
 903#define ALL_INIT_SECTIONS INIT_SECTIONS, ALL_XXXINIT_SECTIONS
 904#define ALL_EXIT_SECTIONS EXIT_SECTIONS, ALL_XXXEXIT_SECTIONS
 905
 906#define DATA_SECTIONS ".data", ".data.rel"
 907#define TEXT_SECTIONS ".text", ".text.unlikely", ".sched.text", \
 908                ".kprobes.text", ".cpuidle.text"
 909#define OTHER_TEXT_SECTIONS ".ref.text", ".head.text", ".spinlock.text", \
 910                ".fixup", ".entry.text", ".exception.text", ".text.*", \
 911                ".coldtext"
 912
 913#define INIT_SECTIONS      ".init.*"
 914#define MEM_INIT_SECTIONS  ".meminit.*"
 915
 916#define EXIT_SECTIONS      ".exit.*"
 917#define MEM_EXIT_SECTIONS  ".memexit.*"
 918
 919#define ALL_TEXT_SECTIONS  ALL_INIT_TEXT_SECTIONS, ALL_EXIT_TEXT_SECTIONS, \
 920                TEXT_SECTIONS, OTHER_TEXT_SECTIONS
 921
 922/* init data sections */
 923static const char *const init_data_sections[] =
 924        { ALL_INIT_DATA_SECTIONS, NULL };
 925
 926/* all init sections */
 927static const char *const init_sections[] = { ALL_INIT_SECTIONS, NULL };
 928
 929/* All init and exit sections (code + data) */
 930static const char *const init_exit_sections[] =
 931        {ALL_INIT_SECTIONS, ALL_EXIT_SECTIONS, NULL };
 932
 933/* all text sections */
 934static const char *const text_sections[] = { ALL_TEXT_SECTIONS, NULL };
 935
 936/* data section */
 937static const char *const data_sections[] = { DATA_SECTIONS, NULL };
 938
 939
 940/* symbols in .data that may refer to init/exit sections */
 941#define DEFAULT_SYMBOL_WHITE_LIST                                       \
 942        "*driver",                                                      \
 943        "*_template", /* scsi uses *_template a lot */                  \
 944        "*_timer",    /* arm uses ops structures named _timer a lot */  \
 945        "*_sht",      /* scsi also used *_sht to some extent */         \
 946        "*_ops",                                                        \
 947        "*_probe",                                                      \
 948        "*_probe_one",                                                  \
 949        "*_console"
 950
 951static const char *const head_sections[] = { ".head.text*", NULL };
 952static const char *const linker_symbols[] =
 953        { "__init_begin", "_sinittext", "_einittext", NULL };
 954static const char *const optim_symbols[] = { "*.constprop.*", NULL };
 955
 956enum mismatch {
 957        TEXT_TO_ANY_INIT,
 958        DATA_TO_ANY_INIT,
 959        TEXT_TO_ANY_EXIT,
 960        DATA_TO_ANY_EXIT,
 961        XXXINIT_TO_SOME_INIT,
 962        XXXEXIT_TO_SOME_EXIT,
 963        ANY_INIT_TO_ANY_EXIT,
 964        ANY_EXIT_TO_ANY_INIT,
 965        EXPORT_TO_INIT_EXIT,
 966        EXTABLE_TO_NON_TEXT,
 967};
 968
 969/**
 970 * Describe how to match sections on different criterias:
 971 *
 972 * @fromsec: Array of sections to be matched.
 973 *
 974 * @bad_tosec: Relocations applied to a section in @fromsec to a section in
 975 * this array is forbidden (black-list).  Can be empty.
 976 *
 977 * @good_tosec: Relocations applied to a section in @fromsec must be
 978 * targetting sections in this array (white-list).  Can be empty.
 979 *
 980 * @mismatch: Type of mismatch.
 981 *
 982 * @symbol_white_list: Do not match a relocation to a symbol in this list
 983 * even if it is targetting a section in @bad_to_sec.
 984 *
 985 * @handler: Specific handler to call when a match is found.  If NULL,
 986 * default_mismatch_handler() will be called.
 987 *
 988 */
 989struct sectioncheck {
 990        const char *fromsec[20];
 991        const char *bad_tosec[20];
 992        const char *good_tosec[20];
 993        enum mismatch mismatch;
 994        const char *symbol_white_list[20];
 995        void (*handler)(const char *modname, struct elf_info *elf,
 996                        const struct sectioncheck* const mismatch,
 997                        Elf_Rela *r, Elf_Sym *sym, const char *fromsec);
 998
 999};
1000
1001static void extable_mismatch_handler(const char *modname, struct elf_info *elf,
1002                                     const struct sectioncheck* const mismatch,
1003                                     Elf_Rela *r, Elf_Sym *sym,
1004                                     const char *fromsec);
1005
1006static const struct sectioncheck sectioncheck[] = {
1007/* Do not reference init/exit code/data from
1008 * normal code and data
1009 */
1010{
1011        .fromsec = { TEXT_SECTIONS, NULL },
1012        .bad_tosec = { ALL_INIT_SECTIONS, NULL },
1013        .mismatch = TEXT_TO_ANY_INIT,
1014        .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1015},
1016{
1017        .fromsec = { DATA_SECTIONS, NULL },
1018        .bad_tosec = { ALL_XXXINIT_SECTIONS, NULL },
1019        .mismatch = DATA_TO_ANY_INIT,
1020        .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1021},
1022{
1023        .fromsec = { DATA_SECTIONS, NULL },
1024        .bad_tosec = { INIT_SECTIONS, NULL },
1025        .mismatch = DATA_TO_ANY_INIT,
1026        .symbol_white_list = {
1027                "*_template", "*_timer", "*_sht", "*_ops",
1028                "*_probe", "*_probe_one", "*_console", NULL
1029        },
1030},
1031{
1032        .fromsec = { TEXT_SECTIONS, NULL },
1033        .bad_tosec = { ALL_EXIT_SECTIONS, NULL },
1034        .mismatch = TEXT_TO_ANY_EXIT,
1035        .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1036},
1037{
1038        .fromsec = { DATA_SECTIONS, NULL },
1039        .bad_tosec = { ALL_EXIT_SECTIONS, NULL },
1040        .mismatch = DATA_TO_ANY_EXIT,
1041        .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1042},
1043/* Do not reference init code/data from meminit code/data */
1044{
1045        .fromsec = { ALL_XXXINIT_SECTIONS, NULL },
1046        .bad_tosec = { INIT_SECTIONS, NULL },
1047        .mismatch = XXXINIT_TO_SOME_INIT,
1048        .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1049},
1050/* Do not reference exit code/data from memexit code/data */
1051{
1052        .fromsec = { ALL_XXXEXIT_SECTIONS, NULL },
1053        .bad_tosec = { EXIT_SECTIONS, NULL },
1054        .mismatch = XXXEXIT_TO_SOME_EXIT,
1055        .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1056},
1057/* Do not use exit code/data from init code */
1058{
1059        .fromsec = { ALL_INIT_SECTIONS, NULL },
1060        .bad_tosec = { ALL_EXIT_SECTIONS, NULL },
1061        .mismatch = ANY_INIT_TO_ANY_EXIT,
1062        .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1063},
1064/* Do not use init code/data from exit code */
1065{
1066        .fromsec = { ALL_EXIT_SECTIONS, NULL },
1067        .bad_tosec = { ALL_INIT_SECTIONS, NULL },
1068        .mismatch = ANY_EXIT_TO_ANY_INIT,
1069        .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1070},
1071{
1072        .fromsec = { ALL_PCI_INIT_SECTIONS, NULL },
1073        .bad_tosec = { INIT_SECTIONS, NULL },
1074        .mismatch = ANY_INIT_TO_ANY_EXIT,
1075        .symbol_white_list = { NULL },
1076},
1077/* Do not export init/exit functions or data */
1078{
1079        .fromsec = { "__ksymtab*", NULL },
1080        .bad_tosec = { INIT_SECTIONS, EXIT_SECTIONS, NULL },
1081        .mismatch = EXPORT_TO_INIT_EXIT,
1082        .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1083},
1084{
1085        .fromsec = { "__ex_table", NULL },
1086        /* If you're adding any new black-listed sections in here, consider
1087         * adding a special 'printer' for them in scripts/check_extable.
1088         */
1089        .bad_tosec = { ".altinstr_replacement", NULL },
1090        .good_tosec = {ALL_TEXT_SECTIONS , NULL},
1091        .mismatch = EXTABLE_TO_NON_TEXT,
1092        .handler = extable_mismatch_handler,
1093}
1094};
1095
1096static const struct sectioncheck *section_mismatch(
1097                const char *fromsec, const char *tosec)
1098{
1099        int i;
1100        int elems = sizeof(sectioncheck) / sizeof(struct sectioncheck);
1101        const struct sectioncheck *check = &sectioncheck[0];
1102
1103        /*
1104         * The target section could be the SHT_NUL section when we're
1105         * handling relocations to un-resolved symbols, trying to match it
1106         * doesn't make much sense and causes build failures on parisc and
1107         * mn10300 architectures.
1108         */
1109        if (*tosec == '\0')
1110                return NULL;
1111
1112        for (i = 0; i < elems; i++) {
1113                if (match(fromsec, check->fromsec)) {
1114                        if (check->bad_tosec[0] && match(tosec, check->bad_tosec))
1115                                return check;
1116                        if (check->good_tosec[0] && !match(tosec, check->good_tosec))
1117                                return check;
1118                }
1119                check++;
1120        }
1121        return NULL;
1122}
1123
1124/**
1125 * Whitelist to allow certain references to pass with no warning.
1126 *
1127 * Pattern 1:
1128 *   If a module parameter is declared __initdata and permissions=0
1129 *   then this is legal despite the warning generated.
1130 *   We cannot see value of permissions here, so just ignore
1131 *   this pattern.
1132 *   The pattern is identified by:
1133 *   tosec   = .init.data
1134 *   fromsec = .data*
1135 *   atsym   =__param*
1136 *
1137 * Pattern 1a:
1138 *   module_param_call() ops can refer to __init set function if permissions=0
1139 *   The pattern is identified by:
1140 *   tosec   = .init.text
1141 *   fromsec = .data*
1142 *   atsym   = __param_ops_*
1143 *
1144 * Pattern 2:
1145 *   Many drivers utilise a *driver container with references to
1146 *   add, remove, probe functions etc.
1147 *   the pattern is identified by:
1148 *   tosec   = init or exit section
1149 *   fromsec = data section
1150 *   atsym = *driver, *_template, *_sht, *_ops, *_probe,
1151 *           *probe_one, *_console, *_timer
1152 *
1153 * Pattern 3:
1154 *   Whitelist all references from .head.text to any init section
1155 *
1156 * Pattern 4:
1157 *   Some symbols belong to init section but still it is ok to reference
1158 *   these from non-init sections as these symbols don't have any memory
1159 *   allocated for them and symbol address and value are same. So even
1160 *   if init section is freed, its ok to reference those symbols.
1161 *   For ex. symbols marking the init section boundaries.
1162 *   This pattern is identified by
1163 *   refsymname = __init_begin, _sinittext, _einittext
1164 *
1165 * Pattern 5:
1166 *   GCC may optimize static inlines when fed constant arg(s) resulting
1167 *   in functions like cpumask_empty() -- generating an associated symbol
1168 *   cpumask_empty.constprop.3 that appears in the audit.  If the const that
1169 *   is passed in comes from __init, like say nmi_ipi_mask, we get a
1170 *   meaningless section warning.  May need to add isra symbols too...
1171 *   This pattern is identified by
1172 *   tosec   = init section
1173 *   fromsec = text section
1174 *   refsymname = *.constprop.*
1175 *
1176 **/
1177static int secref_whitelist(const struct sectioncheck *mismatch,
1178                            const char *fromsec, const char *fromsym,
1179                            const char *tosec, const char *tosym)
1180{
1181        /* Check for pattern 1 */
1182        if (match(tosec, init_data_sections) &&
1183            match(fromsec, data_sections) &&
1184            (strncmp(fromsym, "__param", strlen("__param")) == 0))
1185                return 0;
1186
1187        /* Check for pattern 1a */
1188        if (strcmp(tosec, ".init.text") == 0 &&
1189            match(fromsec, data_sections) &&
1190            (strncmp(fromsym, "__param_ops_", strlen("__param_ops_")) == 0))
1191                return 0;
1192
1193        /* Check for pattern 2 */
1194        if (match(tosec, init_exit_sections) &&
1195            match(fromsec, data_sections) &&
1196            match(fromsym, mismatch->symbol_white_list))
1197                return 0;
1198
1199        /* Check for pattern 3 */
1200        if (match(fromsec, head_sections) &&
1201            match(tosec, init_sections))
1202                return 0;
1203
1204        /* Check for pattern 4 */
1205        if (match(tosym, linker_symbols))
1206                return 0;
1207
1208        /* Check for pattern 5 */
1209        if (match(fromsec, text_sections) &&
1210            match(tosec, init_sections) &&
1211            match(fromsym, optim_symbols))
1212                return 0;
1213
1214        return 1;
1215}
1216
1217/**
1218 * Find symbol based on relocation record info.
1219 * In some cases the symbol supplied is a valid symbol so
1220 * return refsym. If st_name != 0 we assume this is a valid symbol.
1221 * In other cases the symbol needs to be looked up in the symbol table
1222 * based on section and address.
1223 *  **/
1224static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr,
1225                                Elf_Sym *relsym)
1226{
1227        Elf_Sym *sym;
1228        Elf_Sym *near = NULL;
1229        Elf64_Sword distance = 20;
1230        Elf64_Sword d;
1231        unsigned int relsym_secindex;
1232
1233        if (relsym->st_name != 0)
1234                return relsym;
1235
1236        relsym_secindex = get_secindex(elf, relsym);
1237        for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
1238                if (get_secindex(elf, sym) != relsym_secindex)
1239                        continue;
1240                if (ELF_ST_TYPE(sym->st_info) == STT_SECTION)
1241                        continue;
1242                if (sym->st_value == addr)
1243                        return sym;
1244                /* Find a symbol nearby - addr are maybe negative */
1245                d = sym->st_value - addr;
1246                if (d < 0)
1247                        d = addr - sym->st_value;
1248                if (d < distance) {
1249                        distance = d;
1250                        near = sym;
1251                }
1252        }
1253        /* We need a close match */
1254        if (distance < 20)
1255                return near;
1256        else
1257                return NULL;
1258}
1259
1260static inline int is_arm_mapping_symbol(const char *str)
1261{
1262        return str[0] == '$' && strchr("axtd", str[1])
1263               && (str[2] == '\0' || str[2] == '.');
1264}
1265
1266/*
1267 * If there's no name there, ignore it; likewise, ignore it if it's
1268 * one of the magic symbols emitted used by current ARM tools.
1269 *
1270 * Otherwise if find_symbols_between() returns those symbols, they'll
1271 * fail the whitelist tests and cause lots of false alarms ... fixable
1272 * only by merging __exit and __init sections into __text, bloating
1273 * the kernel (which is especially evil on embedded platforms).
1274 */
1275static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym)
1276{
1277        const char *name = elf->strtab + sym->st_name;
1278
1279        if (!name || !strlen(name))
1280                return 0;
1281        return !is_arm_mapping_symbol(name);
1282}
1283
1284/*
1285 * Find symbols before or equal addr and after addr - in the section sec.
1286 * If we find two symbols with equal offset prefer one with a valid name.
1287 * The ELF format may have a better way to detect what type of symbol
1288 * it is, but this works for now.
1289 **/
1290static Elf_Sym *find_elf_symbol2(struct elf_info *elf, Elf_Addr addr,
1291                                 const char *sec)
1292{
1293        Elf_Sym *sym;
1294        Elf_Sym *near = NULL;
1295        Elf_Addr distance = ~0;
1296
1297        for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
1298                const char *symsec;
1299
1300                if (is_shndx_special(sym->st_shndx))
1301                        continue;
1302                symsec = sec_name(elf, get_secindex(elf, sym));
1303                if (strcmp(symsec, sec) != 0)
1304                        continue;
1305                if (!is_valid_name(elf, sym))
1306                        continue;
1307                if (sym->st_value <= addr) {
1308                        if ((addr - sym->st_value) < distance) {
1309                                distance = addr - sym->st_value;
1310                                near = sym;
1311                        } else if ((addr - sym->st_value) == distance) {
1312                                near = sym;
1313                        }
1314                }
1315        }
1316        return near;
1317}
1318
1319/*
1320 * Convert a section name to the function/data attribute
1321 * .init.text => __init
1322 * .memexitconst => __memconst
1323 * etc.
1324 *
1325 * The memory of returned value has been allocated on a heap. The user of this
1326 * method should free it after usage.
1327*/
1328static char *sec2annotation(const char *s)
1329{
1330        if (match(s, init_exit_sections)) {
1331                char *p = malloc(20);
1332                char *r = p;
1333
1334                *p++ = '_';
1335                *p++ = '_';
1336                if (*s == '.')
1337                        s++;
1338                while (*s && *s != '.')
1339                        *p++ = *s++;
1340                *p = '\0';
1341                if (*s == '.')
1342                        s++;
1343                if (strstr(s, "rodata") != NULL)
1344                        strcat(p, "const ");
1345                else if (strstr(s, "data") != NULL)
1346                        strcat(p, "data ");
1347                else
1348                        strcat(p, " ");
1349                return r;
1350        } else {
1351                return strdup("");
1352        }
1353}
1354
1355static int is_function(Elf_Sym *sym)
1356{
1357        if (sym)
1358                return ELF_ST_TYPE(sym->st_info) == STT_FUNC;
1359        else
1360                return -1;
1361}
1362
1363static void print_section_list(const char * const list[20])
1364{
1365        const char *const *s = list;
1366
1367        while (*s) {
1368                fprintf(stderr, "%s", *s);
1369                s++;
1370                if (*s)
1371                        fprintf(stderr, ", ");
1372        }
1373        fprintf(stderr, "\n");
1374}
1375
1376static inline void get_pretty_name(int is_func, const char** name, const char** name_p)
1377{
1378        switch (is_func) {
1379        case 0: *name = "variable"; *name_p = ""; break;
1380        case 1: *name = "function"; *name_p = "()"; break;
1381        default: *name = "(unknown reference)"; *name_p = ""; break;
1382        }
1383}
1384
1385/*
1386 * Print a warning about a section mismatch.
1387 * Try to find symbols near it so user can find it.
1388 * Check whitelist before warning - it may be a false positive.
1389 */
1390static void report_sec_mismatch(const char *modname,
1391                                const struct sectioncheck *mismatch,
1392                                const char *fromsec,
1393                                unsigned long long fromaddr,
1394                                const char *fromsym,
1395                                int from_is_func,
1396                                const char *tosec, const char *tosym,
1397                                int to_is_func)
1398{
1399        const char *from, *from_p;
1400        const char *to, *to_p;
1401        char *prl_from;
1402        char *prl_to;
1403
1404        sec_mismatch_count++;
1405        if (!sec_mismatch_verbose)
1406                return;
1407
1408        get_pretty_name(from_is_func, &from, &from_p);
1409        get_pretty_name(to_is_func, &to, &to_p);
1410
1411        warn("%s(%s+0x%llx): Section mismatch in reference from the %s %s%s "
1412             "to the %s %s:%s%s\n",
1413             modname, fromsec, fromaddr, from, fromsym, from_p, to, tosec,
1414             tosym, to_p);
1415
1416        switch (mismatch->mismatch) {
1417        case TEXT_TO_ANY_INIT:
1418                prl_from = sec2annotation(fromsec);
1419                prl_to = sec2annotation(tosec);
1420                fprintf(stderr,
1421                "The function %s%s() references\n"
1422                "the %s %s%s%s.\n"
1423                "This is often because %s lacks a %s\n"
1424                "annotation or the annotation of %s is wrong.\n",
1425                prl_from, fromsym,
1426                to, prl_to, tosym, to_p,
1427                fromsym, prl_to, tosym);
1428                free(prl_from);
1429                free(prl_to);
1430                break;
1431        case DATA_TO_ANY_INIT: {
1432                prl_to = sec2annotation(tosec);
1433                fprintf(stderr,
1434                "The variable %s references\n"
1435                "the %s %s%s%s\n"
1436                "If the reference is valid then annotate the\n"
1437                "variable with __init* or __refdata (see linux/init.h) "
1438                "or name the variable:\n",
1439                fromsym, to, prl_to, tosym, to_p);
1440                print_section_list(mismatch->symbol_white_list);
1441                free(prl_to);
1442                break;
1443        }
1444        case TEXT_TO_ANY_EXIT:
1445                prl_to = sec2annotation(tosec);
1446                fprintf(stderr,
1447                "The function %s() references a %s in an exit section.\n"
1448                "Often the %s %s%s has valid usage outside the exit section\n"
1449                "and the fix is to remove the %sannotation of %s.\n",
1450                fromsym, to, to, tosym, to_p, prl_to, tosym);
1451                free(prl_to);
1452                break;
1453        case DATA_TO_ANY_EXIT: {
1454                prl_to = sec2annotation(tosec);
1455                fprintf(stderr,
1456                "The variable %s references\n"
1457                "the %s %s%s%s\n"
1458                "If the reference is valid then annotate the\n"
1459                "variable with __exit* (see linux/init.h) or "
1460                "name the variable:\n",
1461                fromsym, to, prl_to, tosym, to_p);
1462                print_section_list(mismatch->symbol_white_list);
1463                free(prl_to);
1464                break;
1465        }
1466        case XXXINIT_TO_SOME_INIT:
1467        case XXXEXIT_TO_SOME_EXIT:
1468                prl_from = sec2annotation(fromsec);
1469                prl_to = sec2annotation(tosec);
1470                fprintf(stderr,
1471                "The %s %s%s%s references\n"
1472                "a %s %s%s%s.\n"
1473                "If %s is only used by %s then\n"
1474                "annotate %s with a matching annotation.\n",
1475                from, prl_from, fromsym, from_p,
1476                to, prl_to, tosym, to_p,
1477                tosym, fromsym, tosym);
1478                free(prl_from);
1479                free(prl_to);
1480                break;
1481        case ANY_INIT_TO_ANY_EXIT:
1482                prl_from = sec2annotation(fromsec);
1483                prl_to = sec2annotation(tosec);
1484                fprintf(stderr,
1485                "The %s %s%s%s references\n"
1486                "a %s %s%s%s.\n"
1487                "This is often seen when error handling "
1488                "in the init function\n"
1489                "uses functionality in the exit path.\n"
1490                "The fix is often to remove the %sannotation of\n"
1491                "%s%s so it may be used outside an exit section.\n",
1492                from, prl_from, fromsym, from_p,
1493                to, prl_to, tosym, to_p,
1494                prl_to, tosym, to_p);
1495                free(prl_from);
1496                free(prl_to);
1497                break;
1498        case ANY_EXIT_TO_ANY_INIT:
1499                prl_from = sec2annotation(fromsec);
1500                prl_to = sec2annotation(tosec);
1501                fprintf(stderr,
1502                "The %s %s%s%s references\n"
1503                "a %s %s%s%s.\n"
1504                "This is often seen when error handling "
1505                "in the exit function\n"
1506                "uses functionality in the init path.\n"
1507                "The fix is often to remove the %sannotation of\n"
1508                "%s%s so it may be used outside an init section.\n",
1509                from, prl_from, fromsym, from_p,
1510                to, prl_to, tosym, to_p,
1511                prl_to, tosym, to_p);
1512                free(prl_from);
1513                free(prl_to);
1514                break;
1515        case EXPORT_TO_INIT_EXIT:
1516                prl_to = sec2annotation(tosec);
1517                fprintf(stderr,
1518                "The symbol %s is exported and annotated %s\n"
1519                "Fix this by removing the %sannotation of %s "
1520                "or drop the export.\n",
1521                tosym, prl_to, prl_to, tosym);
1522                free(prl_to);
1523                break;
1524        case EXTABLE_TO_NON_TEXT:
1525                fatal("There's a special handler for this mismatch type, "
1526                      "we should never get here.");
1527                break;
1528        }
1529        fprintf(stderr, "\n");
1530}
1531
1532static void default_mismatch_handler(const char *modname, struct elf_info *elf,
1533                                     const struct sectioncheck* const mismatch,
1534                                     Elf_Rela *r, Elf_Sym *sym, const char *fromsec)
1535{
1536        const char *tosec;
1537        Elf_Sym *to;
1538        Elf_Sym *from;
1539        const char *tosym;
1540        const char *fromsym;
1541
1542        from = find_elf_symbol2(elf, r->r_offset, fromsec);
1543        fromsym = sym_name(elf, from);
1544
1545        if (!strncmp(fromsym, "reference___initcall",
1546                     sizeof("reference___initcall")-1))
1547                return;
1548
1549        tosec = sec_name(elf, get_secindex(elf, sym));
1550        to = find_elf_symbol(elf, r->r_addend, sym);
1551        tosym = sym_name(elf, to);
1552
1553        /* check whitelist - we may ignore it */
1554        if (secref_whitelist(mismatch,
1555                             fromsec, fromsym, tosec, tosym)) {
1556                report_sec_mismatch(modname, mismatch,
1557                                    fromsec, r->r_offset, fromsym,
1558                                    is_function(from), tosec, tosym,
1559                                    is_function(to));
1560        }
1561}
1562
1563static int is_executable_section(struct elf_info* elf, unsigned int section_index)
1564{
1565        if (section_index > elf->num_sections)
1566                fatal("section_index is outside elf->num_sections!\n");
1567
1568        return ((elf->sechdrs[section_index].sh_flags & SHF_EXECINSTR) == SHF_EXECINSTR);
1569}
1570
1571/*
1572 * We rely on a gross hack in section_rel[a]() calling find_extable_entry_size()
1573 * to know the sizeof(struct exception_table_entry) for the target architecture.
1574 */
1575static unsigned int extable_entry_size = 0;
1576static void find_extable_entry_size(const char* const sec, const Elf_Rela* r)
1577{
1578        /*
1579         * If we're currently checking the second relocation within __ex_table,
1580         * that relocation offset tells us the offsetof(struct
1581         * exception_table_entry, fixup) which is equal to sizeof(struct
1582         * exception_table_entry) divided by two.  We use that to our advantage
1583         * since there's no portable way to get that size as every architecture
1584         * seems to go with different sized types.  Not pretty but better than
1585         * hard-coding the size for every architecture..
1586         */
1587        if (!extable_entry_size)
1588                extable_entry_size = r->r_offset * 2;
1589}
1590
1591static inline bool is_extable_fault_address(Elf_Rela *r)
1592{
1593        /*
1594         * extable_entry_size is only discovered after we've handled the
1595         * _second_ relocation in __ex_table, so only abort when we're not
1596         * handling the first reloc and extable_entry_size is zero.
1597         */
1598        if (r->r_offset && extable_entry_size == 0)
1599                fatal("extable_entry size hasn't been discovered!\n");
1600
1601        return ((r->r_offset == 0) ||
1602                (r->r_offset % extable_entry_size == 0));
1603}
1604
1605#define is_second_extable_reloc(Start, Cur, Sec)                        \
1606        (((Cur) == (Start) + 1) && (strcmp("__ex_table", (Sec)) == 0))
1607
1608static void report_extable_warnings(const char* modname, struct elf_info* elf,
1609                                    const struct sectioncheck* const mismatch,
1610                                    Elf_Rela* r, Elf_Sym* sym,
1611                                    const char* fromsec, const char* tosec)
1612{
1613        Elf_Sym* fromsym = find_elf_symbol2(elf, r->r_offset, fromsec);
1614        const char* fromsym_name = sym_name(elf, fromsym);
1615        Elf_Sym* tosym = find_elf_symbol(elf, r->r_addend, sym);
1616        const char* tosym_name = sym_name(elf, tosym);
1617        const char* from_pretty_name;
1618        const char* from_pretty_name_p;
1619        const char* to_pretty_name;
1620        const char* to_pretty_name_p;
1621
1622        get_pretty_name(is_function(fromsym),
1623                        &from_pretty_name, &from_pretty_name_p);
1624        get_pretty_name(is_function(tosym),
1625                        &to_pretty_name, &to_pretty_name_p);
1626
1627        warn("%s(%s+0x%lx): Section mismatch in reference"
1628             " from the %s %s%s to the %s %s:%s%s\n",
1629             modname, fromsec, (long)r->r_offset, from_pretty_name,
1630             fromsym_name, from_pretty_name_p,
1631             to_pretty_name, tosec, tosym_name, to_pretty_name_p);
1632
1633        if (!match(tosec, mismatch->bad_tosec) &&
1634            is_executable_section(elf, get_secindex(elf, sym)))
1635                fprintf(stderr,
1636                        "The relocation at %s+0x%lx references\n"
1637                        "section \"%s\" which is not in the list of\n"
1638                        "authorized sections.  If you're adding a new section\n"
1639                        "and/or if this reference is valid, add \"%s\" to the\n"
1640                        "list of authorized sections to jump to on fault.\n"
1641                        "This can be achieved by adding \"%s\" to \n"
1642                        "OTHER_TEXT_SECTIONS in scripts/mod/modpost.c.\n",
1643                        fromsec, (long)r->r_offset, tosec, tosec, tosec);
1644}
1645
1646static void extable_mismatch_handler(const char* modname, struct elf_info *elf,
1647                                     const struct sectioncheck* const mismatch,
1648                                     Elf_Rela* r, Elf_Sym* sym,
1649                                     const char *fromsec)
1650{
1651        const char* tosec = sec_name(elf, get_secindex(elf, sym));
1652
1653        sec_mismatch_count++;
1654
1655        if (sec_mismatch_verbose)
1656                report_extable_warnings(modname, elf, mismatch, r, sym,
1657                                        fromsec, tosec);
1658
1659        if (match(tosec, mismatch->bad_tosec))
1660                fatal("The relocation at %s+0x%lx references\n"
1661                      "section \"%s\" which is black-listed.\n"
1662                      "Something is seriously wrong and should be fixed.\n"
1663                      "You might get more information about where this is\n"
1664                      "coming from by using scripts/check_extable.sh %s\n",
1665                      fromsec, (long)r->r_offset, tosec, modname);
1666        else if (!is_executable_section(elf, get_secindex(elf, sym))) {
1667                if (is_extable_fault_address(r))
1668                        fatal("The relocation at %s+0x%lx references\n"
1669                              "section \"%s\" which is not executable, IOW\n"
1670                              "it is not possible for the kernel to fault\n"
1671                              "at that address.  Something is seriously wrong\n"
1672                              "and should be fixed.\n",
1673                              fromsec, (long)r->r_offset, tosec);
1674                else
1675                        fatal("The relocation at %s+0x%lx references\n"
1676                              "section \"%s\" which is not executable, IOW\n"
1677                              "the kernel will fault if it ever tries to\n"
1678                              "jump to it.  Something is seriously wrong\n"
1679                              "and should be fixed.\n",
1680                              fromsec, (long)r->r_offset, tosec);
1681        }
1682}
1683
1684static void check_section_mismatch(const char *modname, struct elf_info *elf,
1685                                   Elf_Rela *r, Elf_Sym *sym, const char *fromsec)
1686{
1687        const char *tosec = sec_name(elf, get_secindex(elf, sym));;
1688        const struct sectioncheck *mismatch = section_mismatch(fromsec, tosec);
1689
1690        if (mismatch) {
1691                if (mismatch->handler)
1692                        mismatch->handler(modname, elf,  mismatch,
1693                                          r, sym, fromsec);
1694                else
1695                        default_mismatch_handler(modname, elf, mismatch,
1696                                                 r, sym, fromsec);
1697        }
1698}
1699
1700static unsigned int *reloc_location(struct elf_info *elf,
1701                                    Elf_Shdr *sechdr, Elf_Rela *r)
1702{
1703        Elf_Shdr *sechdrs = elf->sechdrs;
1704        int section = sechdr->sh_info;
1705
1706        return (void *)elf->hdr + sechdrs[section].sh_offset +
1707                r->r_offset;
1708}
1709
1710static int addend_386_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1711{
1712        unsigned int r_typ = ELF_R_TYPE(r->r_info);
1713        unsigned int *location = reloc_location(elf, sechdr, r);
1714
1715        switch (r_typ) {
1716        case R_386_32:
1717                r->r_addend = TO_NATIVE(*location);
1718                break;
1719        case R_386_PC32:
1720                r->r_addend = TO_NATIVE(*location) + 4;
1721                /* For CONFIG_RELOCATABLE=y */
1722                if (elf->hdr->e_type == ET_EXEC)
1723                        r->r_addend += r->r_offset;
1724                break;
1725        }
1726        return 0;
1727}
1728
1729#ifndef R_ARM_CALL
1730#define R_ARM_CALL      28
1731#endif
1732#ifndef R_ARM_JUMP24
1733#define R_ARM_JUMP24    29
1734#endif
1735
1736#ifndef R_ARM_THM_CALL
1737#define R_ARM_THM_CALL          10
1738#endif
1739#ifndef R_ARM_THM_JUMP24
1740#define R_ARM_THM_JUMP24        30
1741#endif
1742#ifndef R_ARM_THM_JUMP19
1743#define R_ARM_THM_JUMP19        51
1744#endif
1745
1746static int addend_arm_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1747{
1748        unsigned int r_typ = ELF_R_TYPE(r->r_info);
1749
1750        switch (r_typ) {
1751        case R_ARM_ABS32:
1752                /* From ARM ABI: (S + A) | T */
1753                r->r_addend = (int)(long)
1754                              (elf->symtab_start + ELF_R_SYM(r->r_info));
1755                break;
1756        case R_ARM_PC24:
1757        case R_ARM_CALL:
1758        case R_ARM_JUMP24:
1759        case R_ARM_THM_CALL:
1760        case R_ARM_THM_JUMP24:
1761        case R_ARM_THM_JUMP19:
1762                /* From ARM ABI: ((S + A) | T) - P */
1763                r->r_addend = (int)(long)(elf->hdr +
1764                              sechdr->sh_offset +
1765                              (r->r_offset - sechdr->sh_addr));
1766                break;
1767        default:
1768                return 1;
1769        }
1770        return 0;
1771}
1772
1773static int addend_mips_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1774{
1775        unsigned int r_typ = ELF_R_TYPE(r->r_info);
1776        unsigned int *location = reloc_location(elf, sechdr, r);
1777        unsigned int inst;
1778
1779        if (r_typ == R_MIPS_HI16)
1780                return 1;       /* skip this */
1781        inst = TO_NATIVE(*location);
1782        switch (r_typ) {
1783        case R_MIPS_LO16:
1784                r->r_addend = inst & 0xffff;
1785                break;
1786        case R_MIPS_26:
1787                r->r_addend = (inst & 0x03ffffff) << 2;
1788                break;
1789        case R_MIPS_32:
1790                r->r_addend = inst;
1791                break;
1792        }
1793        return 0;
1794}
1795
1796static void section_rela(const char *modname, struct elf_info *elf,
1797                         Elf_Shdr *sechdr)
1798{
1799        Elf_Sym  *sym;
1800        Elf_Rela *rela;
1801        Elf_Rela r;
1802        unsigned int r_sym;
1803        const char *fromsec;
1804
1805        Elf_Rela *start = (void *)elf->hdr + sechdr->sh_offset;
1806        Elf_Rela *stop  = (void *)start + sechdr->sh_size;
1807
1808        fromsec = sech_name(elf, sechdr);
1809        fromsec += strlen(".rela");
1810        /* if from section (name) is know good then skip it */
1811        if (match(fromsec, section_white_list))
1812                return;
1813
1814        for (rela = start; rela < stop; rela++) {
1815                r.r_offset = TO_NATIVE(rela->r_offset);
1816#if KERNEL_ELFCLASS == ELFCLASS64
1817                if (elf->hdr->e_machine == EM_MIPS) {
1818                        unsigned int r_typ;
1819                        r_sym = ELF64_MIPS_R_SYM(rela->r_info);
1820                        r_sym = TO_NATIVE(r_sym);
1821                        r_typ = ELF64_MIPS_R_TYPE(rela->r_info);
1822                        r.r_info = ELF64_R_INFO(r_sym, r_typ);
1823                } else {
1824                        r.r_info = TO_NATIVE(rela->r_info);
1825                        r_sym = ELF_R_SYM(r.r_info);
1826                }
1827#else
1828                r.r_info = TO_NATIVE(rela->r_info);
1829                r_sym = ELF_R_SYM(r.r_info);
1830#endif
1831                r.r_addend = TO_NATIVE(rela->r_addend);
1832                sym = elf->symtab_start + r_sym;
1833                /* Skip special sections */
1834                if (is_shndx_special(sym->st_shndx))
1835                        continue;
1836                if (is_second_extable_reloc(start, rela, fromsec))
1837                        find_extable_entry_size(fromsec, &r);
1838                check_section_mismatch(modname, elf, &r, sym, fromsec);
1839        }
1840}
1841
1842static void section_rel(const char *modname, struct elf_info *elf,
1843                        Elf_Shdr *sechdr)
1844{
1845        Elf_Sym *sym;
1846        Elf_Rel *rel;
1847        Elf_Rela r;
1848        unsigned int r_sym;
1849        const char *fromsec;
1850
1851        Elf_Rel *start = (void *)elf->hdr + sechdr->sh_offset;
1852        Elf_Rel *stop  = (void *)start + sechdr->sh_size;
1853
1854        fromsec = sech_name(elf, sechdr);
1855        fromsec += strlen(".rel");
1856        /* if from section (name) is know good then skip it */
1857        if (match(fromsec, section_white_list))
1858                return;
1859
1860        for (rel = start; rel < stop; rel++) {
1861                r.r_offset = TO_NATIVE(rel->r_offset);
1862#if KERNEL_ELFCLASS == ELFCLASS64
1863                if (elf->hdr->e_machine == EM_MIPS) {
1864                        unsigned int r_typ;
1865                        r_sym = ELF64_MIPS_R_SYM(rel->r_info);
1866                        r_sym = TO_NATIVE(r_sym);
1867                        r_typ = ELF64_MIPS_R_TYPE(rel->r_info);
1868                        r.r_info = ELF64_R_INFO(r_sym, r_typ);
1869                } else {
1870                        r.r_info = TO_NATIVE(rel->r_info);
1871                        r_sym = ELF_R_SYM(r.r_info);
1872                }
1873#else
1874                r.r_info = TO_NATIVE(rel->r_info);
1875                r_sym = ELF_R_SYM(r.r_info);
1876#endif
1877                r.r_addend = 0;
1878                switch (elf->hdr->e_machine) {
1879                case EM_386:
1880                        if (addend_386_rel(elf, sechdr, &r))
1881                                continue;
1882                        break;
1883                case EM_ARM:
1884                        if (addend_arm_rel(elf, sechdr, &r))
1885                                continue;
1886                        break;
1887                case EM_MIPS:
1888                        if (addend_mips_rel(elf, sechdr, &r))
1889                                continue;
1890                        break;
1891                }
1892                sym = elf->symtab_start + r_sym;
1893                /* Skip special sections */
1894                if (is_shndx_special(sym->st_shndx))
1895                        continue;
1896                if (is_second_extable_reloc(start, rel, fromsec))
1897                        find_extable_entry_size(fromsec, &r);
1898                check_section_mismatch(modname, elf, &r, sym, fromsec);
1899        }
1900}
1901
1902/**
1903 * A module includes a number of sections that are discarded
1904 * either when loaded or when used as built-in.
1905 * For loaded modules all functions marked __init and all data
1906 * marked __initdata will be discarded when the module has been initialized.
1907 * Likewise for modules used built-in the sections marked __exit
1908 * are discarded because __exit marked function are supposed to be called
1909 * only when a module is unloaded which never happens for built-in modules.
1910 * The check_sec_ref() function traverses all relocation records
1911 * to find all references to a section that reference a section that will
1912 * be discarded and warns about it.
1913 **/
1914static void check_sec_ref(struct module *mod, const char *modname,
1915                          struct elf_info *elf)
1916{
1917        int i;
1918        Elf_Shdr *sechdrs = elf->sechdrs;
1919
1920        /* Walk through all sections */
1921        for (i = 0; i < elf->num_sections; i++) {
1922                check_section(modname, elf, &elf->sechdrs[i]);
1923                /* We want to process only relocation sections and not .init */
1924                if (sechdrs[i].sh_type == SHT_RELA)
1925                        section_rela(modname, elf, &elf->sechdrs[i]);
1926                else if (sechdrs[i].sh_type == SHT_REL)
1927                        section_rel(modname, elf, &elf->sechdrs[i]);
1928        }
1929}
1930
1931static char *remove_dot(char *s)
1932{
1933        size_t n = strcspn(s, ".");
1934
1935        if (n && s[n]) {
1936                size_t m = strspn(s + n + 1, "0123456789");
1937                if (m && (s[n + m] == '.' || s[n + m] == 0))
1938                        s[n] = 0;
1939        }
1940        return s;
1941}
1942
1943static void read_symbols(char *modname)
1944{
1945        const char *symname;
1946        char *version;
1947        char *license;
1948        struct module *mod;
1949        struct elf_info info = { };
1950        Elf_Sym *sym;
1951
1952        if (!parse_elf(&info, modname))
1953                return;
1954
1955        mod = new_module(modname);
1956
1957        /* When there's no vmlinux, don't print warnings about
1958         * unresolved symbols (since there'll be too many ;) */
1959        if (is_vmlinux(modname)) {
1960                have_vmlinux = 1;
1961                mod->skip = 1;
1962        }
1963
1964        license = get_modinfo(info.modinfo, info.modinfo_len, "license");
1965        if (info.modinfo && !license && !is_vmlinux(modname))
1966                warn("modpost: missing MODULE_LICENSE() in %s\n"
1967                     "see include/linux/module.h for "
1968                     "more information\n", modname);
1969        while (license) {
1970                if (license_is_gpl_compatible(license))
1971                        mod->gpl_compatible = 1;
1972                else {
1973                        mod->gpl_compatible = 0;
1974                        break;
1975                }
1976                license = get_next_modinfo(info.modinfo, info.modinfo_len,
1977                                           "license", license);
1978        }
1979
1980        for (sym = info.symtab_start; sym < info.symtab_stop; sym++) {
1981                symname = remove_dot(info.strtab + sym->st_name);
1982
1983                handle_modversions(mod, &info, sym, symname);
1984                handle_moddevtable(mod, &info, sym, symname);
1985        }
1986        if (!is_vmlinux(modname) ||
1987             (is_vmlinux(modname) && vmlinux_section_warnings))
1988                check_sec_ref(mod, modname, &info);
1989
1990        version = get_modinfo(info.modinfo, info.modinfo_len, "version");
1991        if (version)
1992                maybe_frob_rcs_version(modname, version, info.modinfo,
1993                                       version - (char *)info.hdr);
1994        if (version || (all_versions && !is_vmlinux(modname)))
1995                get_src_version(modname, mod->srcversion,
1996                                sizeof(mod->srcversion)-1);
1997
1998        parse_elf_finish(&info);
1999
2000        /* Our trick to get versioning for module struct etc. - it's
2001         * never passed as an argument to an exported function, so
2002         * the automatic versioning doesn't pick it up, but it's really
2003         * important anyhow */
2004        if (modversions)
2005                mod->unres = alloc_symbol("module_layout", 0, mod->unres);
2006}
2007
2008static void read_symbols_from_files(const char *filename)
2009{
2010        FILE *in = stdin;
2011        char fname[PATH_MAX];
2012
2013        if (strcmp(filename, "-") != 0) {
2014                in = fopen(filename, "r");
2015                if (!in)
2016                        fatal("Can't open filenames file %s: %m", filename);
2017        }
2018
2019        while (fgets(fname, PATH_MAX, in) != NULL) {
2020                if (strends(fname, "\n"))
2021                        fname[strlen(fname)-1] = '\0';
2022                read_symbols(fname);
2023        }
2024
2025        if (in != stdin)
2026                fclose(in);
2027}
2028
2029#define SZ 500
2030
2031/* We first write the generated file into memory using the
2032 * following helper, then compare to the file on disk and
2033 * only update the later if anything changed */
2034
2035void __attribute__((format(printf, 2, 3))) buf_printf(struct buffer *buf,
2036                                                      const char *fmt, ...)
2037{
2038        char tmp[SZ];
2039        int len;
2040        va_list ap;
2041
2042        va_start(ap, fmt);
2043        len = vsnprintf(tmp, SZ, fmt, ap);
2044        buf_write(buf, tmp, len);
2045        va_end(ap);
2046}
2047
2048void buf_write(struct buffer *buf, const char *s, int len)
2049{
2050        if (buf->size - buf->pos < len) {
2051                buf->size += len + SZ;
2052                buf->p = realloc(buf->p, buf->size);
2053        }
2054        strncpy(buf->p + buf->pos, s, len);
2055        buf->pos += len;
2056}
2057
2058static void check_for_gpl_usage(enum export exp, const char *m, const char *s)
2059{
2060        const char *e = is_vmlinux(m) ?"":".ko";
2061
2062        switch (exp) {
2063        case export_gpl:
2064                fatal("modpost: GPL-incompatible module %s%s "
2065                      "uses GPL-only symbol '%s'\n", m, e, s);
2066                break;
2067        case export_unused_gpl:
2068                fatal("modpost: GPL-incompatible module %s%s "
2069                      "uses GPL-only symbol marked UNUSED '%s'\n", m, e, s);
2070                break;
2071        case export_gpl_future:
2072                warn("modpost: GPL-incompatible module %s%s "
2073                      "uses future GPL-only symbol '%s'\n", m, e, s);
2074                break;
2075        case export_plain:
2076        case export_unused:
2077        case export_unknown:
2078                /* ignore */
2079                break;
2080        }
2081}
2082
2083static void check_for_unused(enum export exp, const char *m, const char *s)
2084{
2085        const char *e = is_vmlinux(m) ?"":".ko";
2086
2087        switch (exp) {
2088        case export_unused:
2089        case export_unused_gpl:
2090                warn("modpost: module %s%s "
2091                      "uses symbol '%s' marked UNUSED\n", m, e, s);
2092                break;
2093        default:
2094                /* ignore */
2095                break;
2096        }
2097}
2098
2099static void check_exports(struct module *mod)
2100{
2101        struct symbol *s, *exp;
2102
2103        for (s = mod->unres; s; s = s->next) {
2104                const char *basename;
2105                exp = find_symbol(s->name);
2106                if (!exp || exp->module == mod)
2107                        continue;
2108                basename = strrchr(mod->name, '/');
2109                if (basename)
2110                        basename++;
2111                else
2112                        basename = mod->name;
2113                if (!mod->gpl_compatible)
2114                        check_for_gpl_usage(exp->export, basename, exp->name);
2115                check_for_unused(exp->export, basename, exp->name);
2116        }
2117}
2118
2119/**
2120 * Header for the generated file
2121 **/
2122static void add_header(struct buffer *b, struct module *mod)
2123{
2124        buf_printf(b, "#include <linux/module.h>\n");
2125        buf_printf(b, "#include <linux/vermagic.h>\n");
2126        buf_printf(b, "#include <linux/compiler.h>\n");
2127        buf_printf(b, "\n");
2128        buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n");
2129        buf_printf(b, "MODULE_INFO(name, KBUILD_MODNAME);\n");
2130        buf_printf(b, "\n");
2131        buf_printf(b, "__visible struct module __this_module\n");
2132        buf_printf(b, "__attribute__((section(\".gnu.linkonce.this_module\"))) = {\n");
2133        buf_printf(b, "\t.name = KBUILD_MODNAME,\n");
2134        if (mod->has_init)
2135                buf_printf(b, "\t.init = init_module,\n");
2136        if (mod->has_cleanup)
2137                buf_printf(b, "#ifdef CONFIG_MODULE_UNLOAD\n"
2138                              "\t.exit = cleanup_module,\n"
2139                              "#endif\n");
2140        buf_printf(b, "\t.arch = MODULE_ARCH_INIT,\n");
2141        buf_printf(b, "};\n");
2142}
2143
2144static void add_intree_flag(struct buffer *b, int is_intree)
2145{
2146        if (is_intree)
2147                buf_printf(b, "\nMODULE_INFO(intree, \"Y\");\n");
2148}
2149
2150static void add_staging_flag(struct buffer *b, const char *name)
2151{
2152        static const char *staging_dir = "drivers/staging";
2153
2154        if (strncmp(staging_dir, name, strlen(staging_dir)) == 0)
2155                buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n");
2156}
2157
2158/* In kernel, this size is defined in linux/module.h;
2159 * here we use Elf_Addr instead of long for covering cross-compile
2160 */
2161#define MODULE_NAME_LEN (64 - sizeof(Elf_Addr))
2162
2163/**
2164 * Record CRCs for unresolved symbols
2165 **/
2166static int add_versions(struct buffer *b, struct module *mod)
2167{
2168        struct symbol *s, *exp;
2169        int err = 0;
2170
2171        for (s = mod->unres; s; s = s->next) {
2172                exp = find_symbol(s->name);
2173                if (!exp || exp->module == mod) {
2174                        if (have_vmlinux && !s->weak) {
2175                                if (warn_unresolved) {
2176                                        warn("\"%s\" [%s.ko] undefined!\n",
2177                                             s->name, mod->name);
2178                                } else {
2179                                        merror("\"%s\" [%s.ko] undefined!\n",
2180                                               s->name, mod->name);
2181                                        err = 1;
2182                                }
2183                        }
2184                        continue;
2185                }
2186                s->module = exp->module;
2187                s->crc_valid = exp->crc_valid;
2188                s->crc = exp->crc;
2189        }
2190
2191        if (!modversions)
2192                return err;
2193
2194        buf_printf(b, "\n");
2195        buf_printf(b, "static const struct modversion_info ____versions[]\n");
2196        buf_printf(b, "__used\n");
2197        buf_printf(b, "__attribute__((section(\"__versions\"))) = {\n");
2198
2199        for (s = mod->unres; s; s = s->next) {
2200                if (!s->module)
2201                        continue;
2202                if (!s->crc_valid) {
2203                        warn("\"%s\" [%s.ko] has no CRC!\n",
2204                                s->name, mod->name);
2205                        continue;
2206                }
2207                if (strlen(s->name) >= MODULE_NAME_LEN) {
2208                        merror("too long symbol \"%s\" [%s.ko]\n",
2209                               s->name, mod->name);
2210                        err = 1;
2211                        break;
2212                }
2213                buf_printf(b, "\t{ %#8x, __VMLINUX_SYMBOL_STR(%s) },\n",
2214                           s->crc, s->name);
2215        }
2216
2217        buf_printf(b, "};\n");
2218
2219        return err;
2220}
2221
2222static void add_depends(struct buffer *b, struct module *mod,
2223                        struct module *modules)
2224{
2225        struct symbol *s;
2226        struct module *m;
2227        int first = 1;
2228
2229        for (m = modules; m; m = m->next)
2230                m->seen = is_vmlinux(m->name);
2231
2232        buf_printf(b, "\n");
2233        buf_printf(b, "static const char __module_depends[]\n");
2234        buf_printf(b, "__used\n");
2235        buf_printf(b, "__attribute__((section(\".modinfo\"))) =\n");
2236        buf_printf(b, "\"depends=");
2237        for (s = mod->unres; s; s = s->next) {
2238                const char *p;
2239                if (!s->module)
2240                        continue;
2241
2242                if (s->module->seen)
2243                        continue;
2244
2245                s->module->seen = 1;
2246                p = strrchr(s->module->name, '/');
2247                if (p)
2248                        p++;
2249                else
2250                        p = s->module->name;
2251                buf_printf(b, "%s%s", first ? "" : ",", p);
2252                first = 0;
2253        }
2254        buf_printf(b, "\";\n");
2255}
2256
2257static void add_srcversion(struct buffer *b, struct module *mod)
2258{
2259        if (mod->srcversion[0]) {
2260                buf_printf(b, "\n");
2261                buf_printf(b, "MODULE_INFO(srcversion, \"%s\");\n",
2262                           mod->srcversion);
2263        }
2264}
2265
2266static void write_if_changed(struct buffer *b, const char *fname)
2267{
2268        char *tmp;
2269        FILE *file;
2270        struct stat st;
2271
2272        file = fopen(fname, "r");
2273        if (!file)
2274                goto write;
2275
2276        if (fstat(fileno(file), &st) < 0)
2277                goto close_write;
2278
2279        if (st.st_size != b->pos)
2280                goto close_write;
2281
2282        tmp = NOFAIL(malloc(b->pos));
2283        if (fread(tmp, 1, b->pos, file) != b->pos)
2284                goto free_write;
2285
2286        if (memcmp(tmp, b->p, b->pos) != 0)
2287                goto free_write;
2288
2289        free(tmp);
2290        fclose(file);
2291        return;
2292
2293 free_write:
2294        free(tmp);
2295 close_write:
2296        fclose(file);
2297 write:
2298        file = fopen(fname, "w");
2299        if (!file) {
2300                perror(fname);
2301                exit(1);
2302        }
2303        if (fwrite(b->p, 1, b->pos, file) != b->pos) {
2304                perror(fname);
2305                exit(1);
2306        }
2307        fclose(file);
2308}
2309
2310/* parse Module.symvers file. line format:
2311 * 0x12345678<tab>symbol<tab>module[[<tab>export]<tab>something]
2312 **/
2313static void read_dump(const char *fname, unsigned int kernel)
2314{
2315        unsigned long size, pos = 0;
2316        void *file = grab_file(fname, &size);
2317        char *line;
2318
2319        if (!file)
2320                /* No symbol versions, silently ignore */
2321                return;
2322
2323        while ((line = get_next_line(&pos, file, size))) {
2324                char *symname, *modname, *d, *export, *end;
2325                unsigned int crc;
2326                struct module *mod;
2327                struct symbol *s;
2328
2329                if (!(symname = strchr(line, '\t')))
2330                        goto fail;
2331                *symname++ = '\0';
2332                if (!(modname = strchr(symname, '\t')))
2333                        goto fail;
2334                *modname++ = '\0';
2335                if ((export = strchr(modname, '\t')) != NULL)
2336                        *export++ = '\0';
2337                if (export && ((end = strchr(export, '\t')) != NULL))
2338                        *end = '\0';
2339                crc = strtoul(line, &d, 16);
2340                if (*symname == '\0' || *modname == '\0' || *d != '\0')
2341                        goto fail;
2342                mod = find_module(modname);
2343                if (!mod) {
2344                        if (is_vmlinux(modname))
2345                                have_vmlinux = 1;
2346                        mod = new_module(modname);
2347                        mod->skip = 1;
2348                }
2349                s = sym_add_exported(symname, mod, export_no(export));
2350                s->kernel    = kernel;
2351                s->preloaded = 1;
2352                sym_update_crc(symname, mod, crc, export_no(export));
2353        }
2354        release_file(file, size);
2355        return;
2356fail:
2357        release_file(file, size);
2358        fatal("parse error in symbol dump file\n");
2359}
2360
2361/* For normal builds always dump all symbols.
2362 * For external modules only dump symbols
2363 * that are not read from kernel Module.symvers.
2364 **/
2365static int dump_sym(struct symbol *sym)
2366{
2367        if (!external_module)
2368                return 1;
2369        if (sym->vmlinux || sym->kernel)
2370                return 0;
2371        return 1;
2372}
2373
2374static void write_dump(const char *fname)
2375{
2376        struct buffer buf = { };
2377        struct symbol *symbol;
2378        int n;
2379
2380        for (n = 0; n < SYMBOL_HASH_SIZE ; n++) {
2381                symbol = symbolhash[n];
2382                while (symbol) {
2383                        if (dump_sym(symbol))
2384                                buf_printf(&buf, "0x%08x\t%s\t%s\t%s\n",
2385                                        symbol->crc, symbol->name,
2386                                        symbol->module->name,
2387                                        export_str(symbol->export));
2388                        symbol = symbol->next;
2389                }
2390        }
2391        write_if_changed(&buf, fname);
2392        free(buf.p);
2393}
2394
2395struct ext_sym_list {
2396        struct ext_sym_list *next;
2397        const char *file;
2398};
2399
2400int main(int argc, char **argv)
2401{
2402        struct module *mod;
2403        struct buffer buf = { };
2404        char *kernel_read = NULL, *module_read = NULL;
2405        char *dump_write = NULL, *files_source = NULL;
2406        int opt;
2407        int err;
2408        struct ext_sym_list *extsym_iter;
2409        struct ext_sym_list *extsym_start = NULL;
2410
2411        while ((opt = getopt(argc, argv, "i:I:e:mnsST:o:awM:K:E")) != -1) {
2412                switch (opt) {
2413                case 'i':
2414                        kernel_read = optarg;
2415                        break;
2416                case 'I':
2417                        module_read = optarg;
2418                        external_module = 1;
2419                        break;
2420                case 'e':
2421                        external_module = 1;
2422                        extsym_iter =
2423                           NOFAIL(malloc(sizeof(*extsym_iter)));
2424                        extsym_iter->next = extsym_start;
2425                        extsym_iter->file = optarg;
2426                        extsym_start = extsym_iter;
2427                        break;
2428                case 'm':
2429                        modversions = 1;
2430                        break;
2431                case 'n':
2432                        ignore_missing_files = 1;
2433                        break;
2434                case 'o':
2435                        dump_write = optarg;
2436                        break;
2437                case 'a':
2438                        all_versions = 1;
2439                        break;
2440                case 's':
2441                        vmlinux_section_warnings = 0;
2442                        break;
2443                case 'S':
2444                        sec_mismatch_verbose = 0;
2445                        break;
2446                case 'T':
2447                        files_source = optarg;
2448                        break;
2449                case 'w':
2450                        warn_unresolved = 1;
2451                        break;
2452                case 'E':
2453                        sec_mismatch_fatal = 1;
2454                        break;
2455                default:
2456                        exit(1);
2457                }
2458        }
2459
2460        if (kernel_read)
2461                read_dump(kernel_read, 1);
2462        if (module_read)
2463                read_dump(module_read, 0);
2464        while (extsym_start) {
2465                read_dump(extsym_start->file, 0);
2466                extsym_iter = extsym_start->next;
2467                free(extsym_start);
2468                extsym_start = extsym_iter;
2469        }
2470
2471        while (optind < argc)
2472                read_symbols(argv[optind++]);
2473
2474        if (files_source)
2475                read_symbols_from_files(files_source);
2476
2477        for (mod = modules; mod; mod = mod->next) {
2478                if (mod->skip)
2479                        continue;
2480                check_exports(mod);
2481        }
2482
2483        err = 0;
2484
2485        for (mod = modules; mod; mod = mod->next) {
2486                char fname[PATH_MAX];
2487
2488                if (mod->skip)
2489                        continue;
2490
2491                buf.pos = 0;
2492
2493                add_header(&buf, mod);
2494                add_intree_flag(&buf, !external_module);
2495                add_staging_flag(&buf, mod->name);
2496                err |= add_versions(&buf, mod);
2497                add_depends(&buf, mod, modules);
2498                add_moddevtable(&buf, mod);
2499                add_srcversion(&buf, mod);
2500
2501                sprintf(fname, "%s.mod.c", mod->name);
2502                write_if_changed(&buf, fname);
2503        }
2504        if (dump_write)
2505                write_dump(dump_write);
2506        if (sec_mismatch_count) {
2507                if (!sec_mismatch_verbose) {
2508                        warn("modpost: Found %d section mismatch(es).\n"
2509                             "To see full details build your kernel with:\n"
2510                             "'make CONFIG_DEBUG_SECTION_MISMATCH=y'\n",
2511                             sec_mismatch_count);
2512                }
2513                if (sec_mismatch_fatal) {
2514                        fatal("modpost: Section mismatches detected.\n"
2515                              "Set CONFIG_SECTION_MISMATCH_WARN_ONLY=y to allow them.\n");
2516                }
2517        }
2518        free(buf.p);
2519
2520        return err;
2521}
2522