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