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