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