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 "modpost.h"
  18#include "../../include/generated/autoconf.h"
  19#include "../../include/linux/license.h"
  20
  21/* Some toolchains use a `_' prefix for all user symbols. */
  22#ifdef CONFIG_SYMBOL_PREFIX
  23#define MODULE_SYMBOL_PREFIX CONFIG_SYMBOL_PREFIX
  24#else
  25#define MODULE_SYMBOL_PREFIX ""
  26#endif
  27
  28
  29/* Are we using CONFIG_MODVERSIONS? */
  30int modversions = 0;
  31/* Warn about undefined symbols? (do so if we have vmlinux) */
  32int have_vmlinux = 0;
  33/* Is CONFIG_MODULE_SRCVERSION_ALL set? */
  34static int all_versions = 0;
  35/* If we are modposting external module set to 1 */
  36static int external_module = 0;
  37/* Warn about section mismatch in vmlinux if set to 1 */
  38static int vmlinux_section_warnings = 1;
  39/* Only warn about unresolved symbols */
  40static int warn_unresolved = 0;
  41/* How a symbol is exported */
  42static int sec_mismatch_count = 0;
  43static int sec_mismatch_verbose = 1;
  44
  45enum export {
  46        export_plain,      export_unused,     export_gpl,
  47        export_unused_gpl, export_gpl_future, export_unknown
  48};
  49
  50#define PRINTF __attribute__ ((format (printf, 1, 2)))
  51
  52PRINTF void fatal(const char *fmt, ...)
  53{
  54        va_list arglist;
  55
  56        fprintf(stderr, "FATAL: ");
  57
  58        va_start(arglist, fmt);
  59        vfprintf(stderr, fmt, arglist);
  60        va_end(arglist);
  61
  62        exit(1);
  63}
  64
  65PRINTF void warn(const char *fmt, ...)
  66{
  67        va_list arglist;
  68
  69        fprintf(stderr, "WARNING: ");
  70
  71        va_start(arglist, fmt);
  72        vfprintf(stderr, fmt, arglist);
  73        va_end(arglist);
  74}
  75
  76PRINTF void merror(const char *fmt, ...)
  77{
  78        va_list arglist;
  79
  80        fprintf(stderr, "ERROR: ");
  81
  82        va_start(arglist, fmt);
  83        vfprintf(stderr, fmt, arglist);
  84        va_end(arglist);
  85}
  86
  87static int is_vmlinux(const char *modname)
  88{
  89        const char *myname;
  90
  91        myname = strrchr(modname, '/');
  92        if (myname)
  93                myname++;
  94        else
  95                myname = modname;
  96
  97        return (strcmp(myname, "vmlinux") == 0) ||
  98               (strcmp(myname, "vmlinux.o") == 0);
  99}
 100
 101void *do_nofail(void *ptr, const char *expr)
 102{
 103        if (!ptr)
 104                fatal("modpost: Memory allocation failure: %s.\n", expr);
 105
 106        return ptr;
 107}
 108
 109/* A list of all modules we processed */
 110static struct module *modules;
 111
 112static struct module *find_module(char *modname)
 113{
 114        struct module *mod;
 115
 116        for (mod = modules; mod; mod = mod->next)
 117                if (strcmp(mod->name, modname) == 0)
 118                        break;
 119        return mod;
 120}
 121
 122static struct module *new_module(char *modname)
 123{
 124        struct module *mod;
 125        char *p, *s;
 126
 127        mod = NOFAIL(malloc(sizeof(*mod)));
 128        memset(mod, 0, sizeof(*mod));
 129        p = NOFAIL(strdup(modname));
 130
 131        /* strip trailing .o */
 132        s = strrchr(p, '.');
 133        if (s != NULL)
 134                if (strcmp(s, ".o") == 0)
 135                        *s = '\0';
 136
 137        /* add to list */
 138        mod->name = p;
 139        mod->gpl_compatible = -1;
 140        mod->next = modules;
 141        modules = mod;
 142
 143        return mod;
 144}
 145
 146/* A hash of all exported symbols,
 147 * struct symbol is also used for lists of unresolved symbols */
 148
 149#define SYMBOL_HASH_SIZE 1024
 150
 151struct symbol {
 152        struct symbol *next;
 153        struct module *module;
 154        unsigned int crc;
 155        int crc_valid;
 156        unsigned int weak:1;
 157        unsigned int vmlinux:1;    /* 1 if symbol is defined in vmlinux */
 158        unsigned int kernel:1;     /* 1 if symbol is from kernel
 159                                    *  (only for external modules) **/
 160        unsigned int preloaded:1;  /* 1 if symbol from Module.symvers */
 161        enum export  export;       /* Type of export */
 162        char name[0];
 163};
 164
 165static struct symbol *symbolhash[SYMBOL_HASH_SIZE];
 166
 167/* This is based on the hash agorithm from gdbm, via tdb */
 168static inline unsigned int tdb_hash(const char *name)
 169{
 170        unsigned value; /* Used to compute the hash value.  */
 171        unsigned   i;   /* Used to cycle through random values. */
 172
 173        /* Set the initial value from the key size. */
 174        for (value = 0x238F13AF * strlen(name), i = 0; name[i]; i++)
 175                value = (value + (((unsigned char *)name)[i] << (i*5 % 24)));
 176
 177        return (1103515243 * value + 12345);
 178}
 179
 180/**
 181 * Allocate a new symbols for use in the hash of exported symbols or
 182 * the list of unresolved symbols per module
 183 **/
 184static struct symbol *alloc_symbol(const char *name, unsigned int weak,
 185                                   struct symbol *next)
 186{
 187        struct symbol *s = NOFAIL(malloc(sizeof(*s) + strlen(name) + 1));
 188
 189        memset(s, 0, sizeof(*s));
 190        strcpy(s->name, name);
 191        s->weak = weak;
 192        s->next = next;
 193        return s;
 194}
 195
 196/* For the hash of exported symbols */
 197static struct symbol *new_symbol(const char *name, struct module *module,
 198                                 enum export export)
 199{
 200        unsigned int hash;
 201        struct symbol *new;
 202
 203        hash = tdb_hash(name) % SYMBOL_HASH_SIZE;
 204        new = symbolhash[hash] = alloc_symbol(name, 0, symbolhash[hash]);
 205        new->module = module;
 206        new->export = export;
 207        return new;
 208}
 209
 210static struct symbol *find_symbol(const char *name)
 211{
 212        struct symbol *s;
 213
 214        /* For our purposes, .foo matches foo.  PPC64 needs this. */
 215        if (name[0] == '.')
 216                name++;
 217
 218        for (s = symbolhash[tdb_hash(name) % SYMBOL_HASH_SIZE]; s; s = s->next) {
 219                if (strcmp(s->name, name) == 0)
 220                        return s;
 221        }
 222        return NULL;
 223}
 224
 225static struct {
 226        const char *str;
 227        enum export export;
 228} export_list[] = {
 229        { .str = "EXPORT_SYMBOL",            .export = export_plain },
 230        { .str = "EXPORT_UNUSED_SYMBOL",     .export = export_unused },
 231        { .str = "EXPORT_SYMBOL_GPL",        .export = export_gpl },
 232        { .str = "EXPORT_UNUSED_SYMBOL_GPL", .export = export_unused_gpl },
 233        { .str = "EXPORT_SYMBOL_GPL_FUTURE", .export = export_gpl_future },
 234        { .str = "(unknown)",                .export = export_unknown },
 235};
 236
 237
 238static const char *export_str(enum export ex)
 239{
 240        return export_list[ex].str;
 241}
 242
 243static enum export export_no(const char *s)
 244{
 245        int i;
 246
 247        if (!s)
 248                return export_unknown;
 249        for (i = 0; export_list[i].export != export_unknown; i++) {
 250                if (strcmp(export_list[i].str, s) == 0)
 251                        return export_list[i].export;
 252        }
 253        return export_unknown;
 254}
 255
 256static enum export export_from_sec(struct elf_info *elf, Elf_Section sec)
 257{
 258        if (sec == elf->export_sec)
 259                return export_plain;
 260        else if (sec == elf->export_unused_sec)
 261                return export_unused;
 262        else if (sec == elf->export_gpl_sec)
 263                return export_gpl;
 264        else if (sec == elf->export_unused_gpl_sec)
 265                return export_unused_gpl;
 266        else if (sec == elf->export_gpl_future_sec)
 267                return export_gpl_future;
 268        else
 269                return export_unknown;
 270}
 271
 272/**
 273 * Add an exported symbol - it may have already been added without a
 274 * CRC, in this case just update the CRC
 275 **/
 276static struct symbol *sym_add_exported(const char *name, struct module *mod,
 277                                       enum export export)
 278{
 279        struct symbol *s = find_symbol(name);
 280
 281        if (!s) {
 282                s = new_symbol(name, mod, export);
 283        } else {
 284                if (!s->preloaded) {
 285                        warn("%s: '%s' exported twice. Previous export "
 286                             "was in %s%s\n", mod->name, name,
 287                             s->module->name,
 288                             is_vmlinux(s->module->name) ?"":".ko");
 289                } else {
 290                        /* In case Modules.symvers was out of date */
 291                        s->module = mod;
 292                }
 293        }
 294        s->preloaded = 0;
 295        s->vmlinux   = is_vmlinux(mod->name);
 296        s->kernel    = 0;
 297        s->export    = export;
 298        return s;
 299}
 300
 301static void sym_update_crc(const char *name, struct module *mod,
 302                           unsigned int crc, enum export export)
 303{
 304        struct symbol *s = find_symbol(name);
 305
 306        if (!s)
 307                s = new_symbol(name, mod, export);
 308        s->crc = crc;
 309        s->crc_valid = 1;
 310}
 311
 312void *grab_file(const char *filename, unsigned long *size)
 313{
 314        struct stat st;
 315        void *map;
 316        int fd;
 317
 318        fd = open(filename, O_RDONLY);
 319        if (fd < 0 || fstat(fd, &st) != 0)
 320                return NULL;
 321
 322        *size = st.st_size;
 323        map = mmap(NULL, *size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
 324        close(fd);
 325
 326        if (map == MAP_FAILED)
 327                return NULL;
 328        return map;
 329}
 330
 331/**
 332  * Return a copy of the next line in a mmap'ed file.
 333  * spaces in the beginning of the line is trimmed away.
 334  * Return a pointer to a static buffer.
 335  **/
 336char *get_next_line(unsigned long *pos, void *file, unsigned long size)
 337{
 338        static char line[4096];
 339        int skip = 1;
 340        size_t len = 0;
 341        signed char *p = (signed char *)file + *pos;
 342        char *s = line;
 343
 344        for (; *pos < size ; (*pos)++) {
 345                if (skip && isspace(*p)) {
 346                        p++;
 347                        continue;
 348                }
 349                skip = 0;
 350                if (*p != '\n' && (*pos < size)) {
 351                        len++;
 352                        *s++ = *p++;
 353                        if (len > 4095)
 354                                break; /* Too long, stop */
 355                } else {
 356                        /* End of string */
 357                        *s = '\0';
 358                        return line;
 359                }
 360        }
 361        /* End of buffer */
 362        return NULL;
 363}
 364
 365void release_file(void *file, unsigned long size)
 366{
 367        munmap(file, size);
 368}
 369
 370static int parse_elf(struct elf_info *info, const char *filename)
 371{
 372        unsigned int i;
 373        Elf_Ehdr *hdr;
 374        Elf_Shdr *sechdrs;
 375        Elf_Sym  *sym;
 376
 377        hdr = grab_file(filename, &info->size);
 378        if (!hdr) {
 379                perror(filename);
 380                exit(1);
 381        }
 382        info->hdr = hdr;
 383        if (info->size < sizeof(*hdr)) {
 384                /* file too small, assume this is an empty .o file */
 385                return 0;
 386        }
 387        /* Is this a valid ELF file? */
 388        if ((hdr->e_ident[EI_MAG0] != ELFMAG0) ||
 389            (hdr->e_ident[EI_MAG1] != ELFMAG1) ||
 390            (hdr->e_ident[EI_MAG2] != ELFMAG2) ||
 391            (hdr->e_ident[EI_MAG3] != ELFMAG3)) {
 392                /* Not an ELF file - silently ignore it */
 393                return 0;
 394        }
 395        /* Fix endianness in ELF header */
 396        hdr->e_type      = TO_NATIVE(hdr->e_type);
 397        hdr->e_machine   = TO_NATIVE(hdr->e_machine);
 398        hdr->e_version   = TO_NATIVE(hdr->e_version);
 399        hdr->e_entry     = TO_NATIVE(hdr->e_entry);
 400        hdr->e_phoff     = TO_NATIVE(hdr->e_phoff);
 401        hdr->e_shoff     = TO_NATIVE(hdr->e_shoff);
 402        hdr->e_flags     = TO_NATIVE(hdr->e_flags);
 403        hdr->e_ehsize    = TO_NATIVE(hdr->e_ehsize);
 404        hdr->e_phentsize = TO_NATIVE(hdr->e_phentsize);
 405        hdr->e_phnum     = TO_NATIVE(hdr->e_phnum);
 406        hdr->e_shentsize = TO_NATIVE(hdr->e_shentsize);
 407        hdr->e_shnum     = TO_NATIVE(hdr->e_shnum);
 408        hdr->e_shstrndx  = TO_NATIVE(hdr->e_shstrndx);
 409        sechdrs = (void *)hdr + hdr->e_shoff;
 410        info->sechdrs = sechdrs;
 411
 412        /* Check if file offset is correct */
 413        if (hdr->e_shoff > info->size) {
 414                fatal("section header offset=%lu in file '%s' is bigger than "
 415                      "filesize=%lu\n", (unsigned long)hdr->e_shoff,
 416                      filename, info->size);
 417                return 0;
 418        }
 419
 420        /* Fix endianness in section headers */
 421        for (i = 0; i < hdr->e_shnum; i++) {
 422                sechdrs[i].sh_name      = TO_NATIVE(sechdrs[i].sh_name);
 423                sechdrs[i].sh_type      = TO_NATIVE(sechdrs[i].sh_type);
 424                sechdrs[i].sh_flags     = TO_NATIVE(sechdrs[i].sh_flags);
 425                sechdrs[i].sh_addr      = TO_NATIVE(sechdrs[i].sh_addr);
 426                sechdrs[i].sh_offset    = TO_NATIVE(sechdrs[i].sh_offset);
 427                sechdrs[i].sh_size      = TO_NATIVE(sechdrs[i].sh_size);
 428                sechdrs[i].sh_link      = TO_NATIVE(sechdrs[i].sh_link);
 429                sechdrs[i].sh_info      = TO_NATIVE(sechdrs[i].sh_info);
 430                sechdrs[i].sh_addralign = TO_NATIVE(sechdrs[i].sh_addralign);
 431                sechdrs[i].sh_entsize   = TO_NATIVE(sechdrs[i].sh_entsize);
 432        }
 433        /* Find symbol table. */
 434        for (i = 1; i < hdr->e_shnum; i++) {
 435                const char *secstrings
 436                        = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset;
 437                const char *secname;
 438                int nobits = sechdrs[i].sh_type == SHT_NOBITS;
 439
 440                if (!nobits && sechdrs[i].sh_offset > info->size) {
 441                        fatal("%s is truncated. sechdrs[i].sh_offset=%lu > "
 442                              "sizeof(*hrd)=%zu\n", filename,
 443                              (unsigned long)sechdrs[i].sh_offset,
 444                              sizeof(*hdr));
 445                        return 0;
 446                }
 447                secname = secstrings + sechdrs[i].sh_name;
 448                if (strcmp(secname, ".modinfo") == 0) {
 449                        if (nobits)
 450                                fatal("%s has NOBITS .modinfo\n", filename);
 451                        info->modinfo = (void *)hdr + sechdrs[i].sh_offset;
 452                        info->modinfo_len = sechdrs[i].sh_size;
 453                } else if (strcmp(secname, "__ksymtab") == 0)
 454                        info->export_sec = i;
 455                else if (strcmp(secname, "__ksymtab_unused") == 0)
 456                        info->export_unused_sec = i;
 457                else if (strcmp(secname, "__ksymtab_gpl") == 0)
 458                        info->export_gpl_sec = i;
 459                else if (strcmp(secname, "__ksymtab_unused_gpl") == 0)
 460                        info->export_unused_gpl_sec = i;
 461                else if (strcmp(secname, "__ksymtab_gpl_future") == 0)
 462                        info->export_gpl_future_sec = i;
 463
 464                if (sechdrs[i].sh_type != SHT_SYMTAB)
 465                        continue;
 466
 467                info->symtab_start = (void *)hdr + sechdrs[i].sh_offset;
 468                info->symtab_stop  = (void *)hdr + sechdrs[i].sh_offset
 469                                                 + sechdrs[i].sh_size;
 470                info->strtab       = (void *)hdr +
 471                                     sechdrs[sechdrs[i].sh_link].sh_offset;
 472        }
 473        if (!info->symtab_start)
 474                fatal("%s has no symtab?\n", filename);
 475
 476        /* Fix endianness in symbols */
 477        for (sym = info->symtab_start; sym < info->symtab_stop; sym++) {
 478                sym->st_shndx = TO_NATIVE(sym->st_shndx);
 479                sym->st_name  = TO_NATIVE(sym->st_name);
 480                sym->st_value = TO_NATIVE(sym->st_value);
 481                sym->st_size  = TO_NATIVE(sym->st_size);
 482        }
 483        return 1;
 484}
 485
 486static void parse_elf_finish(struct elf_info *info)
 487{
 488        release_file(info->hdr, info->size);
 489}
 490
 491static int ignore_undef_symbol(struct elf_info *info, const char *symname)
 492{
 493        /* ignore __this_module, it will be resolved shortly */
 494        if (strcmp(symname, MODULE_SYMBOL_PREFIX "__this_module") == 0)
 495                return 1;
 496        /* ignore global offset table */
 497        if (strcmp(symname, "_GLOBAL_OFFSET_TABLE_") == 0)
 498                return 1;
 499        if (info->hdr->e_machine == EM_PPC)
 500                /* Special register function linked on all modules during final link of .ko */
 501                if (strncmp(symname, "_restgpr_", sizeof("_restgpr_") - 1) == 0 ||
 502                    strncmp(symname, "_savegpr_", sizeof("_savegpr_") - 1) == 0 ||
 503                    strncmp(symname, "_rest32gpr_", sizeof("_rest32gpr_") - 1) == 0 ||
 504                    strncmp(symname, "_save32gpr_", sizeof("_save32gpr_") - 1) == 0)
 505                        return 1;
 506        if (info->hdr->e_machine == EM_PPC64)
 507                /* Special register function linked on all modules during final link of .ko */
 508                if (strncmp(symname, "_restgpr0_", sizeof("_restgpr0_") - 1) == 0 ||
 509                    strncmp(symname, "_savegpr0_", sizeof("_savegpr0_") - 1) == 0)
 510                        return 1;
 511        /* Do not ignore this symbol */
 512        return 0;
 513}
 514
 515#define CRC_PFX     MODULE_SYMBOL_PREFIX "__crc_"
 516#define KSYMTAB_PFX MODULE_SYMBOL_PREFIX "__ksymtab_"
 517
 518static void handle_modversions(struct module *mod, struct elf_info *info,
 519                               Elf_Sym *sym, const char *symname)
 520{
 521        unsigned int crc;
 522        enum export export = export_from_sec(info, sym->st_shndx);
 523
 524        switch (sym->st_shndx) {
 525        case SHN_COMMON:
 526                warn("\"%s\" [%s] is COMMON symbol\n", symname, mod->name);
 527                break;
 528        case SHN_ABS:
 529                /* CRC'd symbol */
 530                if (strncmp(symname, CRC_PFX, strlen(CRC_PFX)) == 0) {
 531                        crc = (unsigned int) sym->st_value;
 532                        sym_update_crc(symname + strlen(CRC_PFX), mod, crc,
 533                                        export);
 534                }
 535                break;
 536        case SHN_UNDEF:
 537                /* undefined symbol */
 538                if (ELF_ST_BIND(sym->st_info) != STB_GLOBAL &&
 539                    ELF_ST_BIND(sym->st_info) != STB_WEAK)
 540                        break;
 541                if (ignore_undef_symbol(info, symname))
 542                        break;
 543/* cope with newer glibc (2.3.4 or higher) STT_ definition in elf.h */
 544#if defined(STT_REGISTER) || defined(STT_SPARC_REGISTER)
 545/* add compatibility with older glibc */
 546#ifndef STT_SPARC_REGISTER
 547#define STT_SPARC_REGISTER STT_REGISTER
 548#endif
 549                if (info->hdr->e_machine == EM_SPARC ||
 550                    info->hdr->e_machine == EM_SPARCV9) {
 551                        /* Ignore register directives. */
 552                        if (ELF_ST_TYPE(sym->st_info) == STT_SPARC_REGISTER)
 553                                break;
 554                        if (symname[0] == '.') {
 555                                char *munged = strdup(symname);
 556                                munged[0] = '_';
 557                                munged[1] = toupper(munged[1]);
 558                                symname = munged;
 559                        }
 560                }
 561#endif
 562
 563                if (memcmp(symname, MODULE_SYMBOL_PREFIX,
 564                           strlen(MODULE_SYMBOL_PREFIX)) == 0) {
 565                        mod->unres =
 566                          alloc_symbol(symname +
 567                                       strlen(MODULE_SYMBOL_PREFIX),
 568                                       ELF_ST_BIND(sym->st_info) == STB_WEAK,
 569                                       mod->unres);
 570                }
 571                break;
 572        default:
 573                /* All exported symbols */
 574                if (strncmp(symname, KSYMTAB_PFX, strlen(KSYMTAB_PFX)) == 0) {
 575                        sym_add_exported(symname + strlen(KSYMTAB_PFX), mod,
 576                                        export);
 577                }
 578                if (strcmp(symname, MODULE_SYMBOL_PREFIX "init_module") == 0)
 579                        mod->has_init = 1;
 580                if (strcmp(symname, MODULE_SYMBOL_PREFIX "cleanup_module") == 0)
 581                        mod->has_cleanup = 1;
 582                break;
 583        }
 584}
 585
 586/**
 587 * Parse tag=value strings from .modinfo section
 588 **/
 589static char *next_string(char *string, unsigned long *secsize)
 590{
 591        /* Skip non-zero chars */
 592        while (string[0]) {
 593                string++;
 594                if ((*secsize)-- <= 1)
 595                        return NULL;
 596        }
 597
 598        /* Skip any zero padding. */
 599        while (!string[0]) {
 600                string++;
 601                if ((*secsize)-- <= 1)
 602                        return NULL;
 603        }
 604        return string;
 605}
 606
 607static char *get_next_modinfo(void *modinfo, unsigned long modinfo_len,
 608                              const char *tag, char *info)
 609{
 610        char *p;
 611        unsigned int taglen = strlen(tag);
 612        unsigned long size = modinfo_len;
 613
 614        if (info) {
 615                size -= info - (char *)modinfo;
 616                modinfo = next_string(info, &size);
 617        }
 618
 619        for (p = modinfo; p; p = next_string(p, &size)) {
 620                if (strncmp(p, tag, taglen) == 0 && p[taglen] == '=')
 621                        return p + taglen + 1;
 622        }
 623        return NULL;
 624}
 625
 626static char *get_modinfo(void *modinfo, unsigned long modinfo_len,
 627                         const char *tag)
 628
 629{
 630        return get_next_modinfo(modinfo, modinfo_len, tag, NULL);
 631}
 632
 633/**
 634 * Test if string s ends in string sub
 635 * return 0 if match
 636 **/
 637static int strrcmp(const char *s, const char *sub)
 638{
 639        int slen, sublen;
 640
 641        if (!s || !sub)
 642                return 1;
 643
 644        slen = strlen(s);
 645        sublen = strlen(sub);
 646
 647        if ((slen == 0) || (sublen == 0))
 648                return 1;
 649
 650        if (sublen > slen)
 651                return 1;
 652
 653        return memcmp(s + slen - sublen, sub, sublen);
 654}
 655
 656static const char *sym_name(struct elf_info *elf, Elf_Sym *sym)
 657{
 658        if (sym)
 659                return elf->strtab + sym->st_name;
 660        else
 661                return "(unknown)";
 662}
 663
 664static const char *sec_name(struct elf_info *elf, int shndx)
 665{
 666        Elf_Shdr *sechdrs = elf->sechdrs;
 667        return (void *)elf->hdr +
 668                elf->sechdrs[elf->hdr->e_shstrndx].sh_offset +
 669                sechdrs[shndx].sh_name;
 670}
 671
 672static const char *sech_name(struct elf_info *elf, Elf_Shdr *sechdr)
 673{
 674        return (void *)elf->hdr +
 675                elf->sechdrs[elf->hdr->e_shstrndx].sh_offset +
 676                sechdr->sh_name;
 677}
 678
 679/* if sym is empty or point to a string
 680 * like ".[0-9]+" then return 1.
 681 * This is the optional prefix added by ld to some sections
 682 */
 683static int number_prefix(const char *sym)
 684{
 685        if (*sym++ == '\0')
 686                return 1;
 687        if (*sym != '.')
 688                return 0;
 689        do {
 690                char c = *sym++;
 691                if (c < '0' || c > '9')
 692                        return 0;
 693        } while (*sym);
 694        return 1;
 695}
 696
 697/* The pattern is an array of simple patterns.
 698 * "foo" will match an exact string equal to "foo"
 699 * "*foo" will match a string that ends with "foo"
 700 * "foo*" will match a string that begins with "foo"
 701 * "foo$" will match a string equal to "foo" or "foo.1"
 702 *   where the '1' can be any number including several digits.
 703 *   The $ syntax is for sections where ld append a dot number
 704 *   to make section name unique.
 705 */
 706static int match(const char *sym, const char * const pat[])
 707{
 708        const char *p;
 709        while (*pat) {
 710                p = *pat++;
 711                const char *endp = p + strlen(p) - 1;
 712
 713                /* "*foo" */
 714                if (*p == '*') {
 715                        if (strrcmp(sym, p + 1) == 0)
 716                                return 1;
 717                }
 718                /* "foo*" */
 719                else if (*endp == '*') {
 720                        if (strncmp(sym, p, strlen(p) - 1) == 0)
 721                                return 1;
 722                }
 723                /* "foo$" */
 724                else if (*endp == '$') {
 725                        if (strncmp(sym, p, strlen(p) - 1) == 0) {
 726                                if (number_prefix(sym + strlen(p) - 1))
 727                                        return 1;
 728                        }
 729                }
 730                /* no wildcards */
 731                else {
 732                        if (strcmp(p, sym) == 0)
 733                                return 1;
 734                }
 735        }
 736        /* no match */
 737        return 0;
 738}
 739
 740/* sections that we do not want to do full section mismatch check on */
 741static const char *section_white_list[] =
 742{
 743        ".comment*",
 744        ".debug*",
 745        ".mdebug*",        /* alpha, score, mips etc. */
 746        ".pdr",            /* alpha, score, mips etc. */
 747        ".stab*",
 748        ".note*",
 749        ".got*",
 750        ".toc*",
 751        NULL
 752};
 753
 754/*
 755 * This is used to find sections missing the SHF_ALLOC flag.
 756 * The cause of this is often a section specified in assembler
 757 * without "ax" / "aw".
 758 */
 759static void check_section(const char *modname, struct elf_info *elf,
 760                          Elf_Shdr *sechdr)
 761{
 762        const char *sec = sech_name(elf, sechdr);
 763
 764        if (sechdr->sh_type == SHT_PROGBITS &&
 765            !(sechdr->sh_flags & SHF_ALLOC) &&
 766            !match(sec, section_white_list)) {
 767                warn("%s (%s): unexpected non-allocatable section.\n"
 768                     "Did you forget to use \"ax\"/\"aw\" in a .S file?\n"
 769                     "Note that for example <linux/init.h> contains\n"
 770                     "section definitions for use in .S files.\n\n",
 771                     modname, sec);
 772        }
 773}
 774
 775
 776
 777#define ALL_INIT_DATA_SECTIONS \
 778        ".init.setup$", ".init.rodata$", \
 779        ".devinit.rodata$", ".cpuinit.rodata$", ".meminit.rodata$" \
 780        ".init.data$", ".devinit.data$", ".cpuinit.data$", ".meminit.data$"
 781#define ALL_EXIT_DATA_SECTIONS \
 782        ".exit.data$", ".devexit.data$", ".cpuexit.data$", ".memexit.data$"
 783
 784#define ALL_INIT_TEXT_SECTIONS \
 785        ".init.text$", ".devinit.text$", ".cpuinit.text$", ".meminit.text$"
 786#define ALL_EXIT_TEXT_SECTIONS \
 787        ".exit.text$", ".devexit.text$", ".cpuexit.text$", ".memexit.text$"
 788
 789#define ALL_XXXINIT_SECTIONS DEV_INIT_SECTIONS, CPU_INIT_SECTIONS, \
 790        MEM_INIT_SECTIONS
 791#define ALL_XXXEXIT_SECTIONS DEV_EXIT_SECTIONS, CPU_EXIT_SECTIONS, \
 792        MEM_EXIT_SECTIONS
 793
 794#define ALL_INIT_SECTIONS INIT_SECTIONS, ALL_XXXINIT_SECTIONS
 795#define ALL_EXIT_SECTIONS EXIT_SECTIONS, ALL_XXXEXIT_SECTIONS
 796
 797#define DATA_SECTIONS ".data$", ".data.rel$"
 798#define TEXT_SECTIONS ".text$"
 799
 800#define INIT_SECTIONS      ".init.*"
 801#define DEV_INIT_SECTIONS  ".devinit.*"
 802#define CPU_INIT_SECTIONS  ".cpuinit.*"
 803#define MEM_INIT_SECTIONS  ".meminit.*"
 804
 805#define EXIT_SECTIONS      ".exit.*"
 806#define DEV_EXIT_SECTIONS  ".devexit.*"
 807#define CPU_EXIT_SECTIONS  ".cpuexit.*"
 808#define MEM_EXIT_SECTIONS  ".memexit.*"
 809
 810/* init data sections */
 811static const char *init_data_sections[] = { ALL_INIT_DATA_SECTIONS, NULL };
 812
 813/* all init sections */
 814static const char *init_sections[] = { ALL_INIT_SECTIONS, NULL };
 815
 816/* All init and exit sections (code + data) */
 817static const char *init_exit_sections[] =
 818        {ALL_INIT_SECTIONS, ALL_EXIT_SECTIONS, NULL };
 819
 820/* data section */
 821static const char *data_sections[] = { DATA_SECTIONS, NULL };
 822
 823
 824/* symbols in .data that may refer to init/exit sections */
 825#define DEFAULT_SYMBOL_WHITE_LIST                                       \
 826        "*driver",                                                      \
 827        "*_template", /* scsi uses *_template a lot */                  \
 828        "*_timer",    /* arm uses ops structures named _timer a lot */  \
 829        "*_sht",      /* scsi also used *_sht to some extent */         \
 830        "*_ops",                                                        \
 831        "*_probe",                                                      \
 832        "*_probe_one",                                                  \
 833        "*_console"
 834
 835static const char *head_sections[] = { ".head.text*", NULL };
 836static const char *linker_symbols[] =
 837        { "__init_begin", "_sinittext", "_einittext", NULL };
 838
 839enum mismatch {
 840        TEXT_TO_ANY_INIT,
 841        DATA_TO_ANY_INIT,
 842        TEXT_TO_ANY_EXIT,
 843        DATA_TO_ANY_EXIT,
 844        XXXINIT_TO_SOME_INIT,
 845        XXXEXIT_TO_SOME_EXIT,
 846        ANY_INIT_TO_ANY_EXIT,
 847        ANY_EXIT_TO_ANY_INIT,
 848        EXPORT_TO_INIT_EXIT,
 849};
 850
 851struct sectioncheck {
 852        const char *fromsec[20];
 853        const char *tosec[20];
 854        enum mismatch mismatch;
 855        const char *symbol_white_list[20];
 856};
 857
 858const struct sectioncheck sectioncheck[] = {
 859/* Do not reference init/exit code/data from
 860 * normal code and data
 861 */
 862{
 863        .fromsec = { TEXT_SECTIONS, NULL },
 864        .tosec   = { ALL_INIT_SECTIONS, NULL },
 865        .mismatch = TEXT_TO_ANY_INIT,
 866        .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
 867},
 868{
 869        .fromsec = { DATA_SECTIONS, NULL },
 870        .tosec   = { ALL_XXXINIT_SECTIONS, NULL },
 871        .mismatch = DATA_TO_ANY_INIT,
 872        .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
 873},
 874{
 875        .fromsec = { DATA_SECTIONS, NULL },
 876        .tosec   = { INIT_SECTIONS, NULL },
 877        .mismatch = DATA_TO_ANY_INIT,
 878        .symbol_white_list = {
 879                "*_template", "*_timer", "*_sht", "*_ops",
 880                "*_probe", "*_probe_one", "*_console", NULL
 881        },
 882},
 883{
 884        .fromsec = { TEXT_SECTIONS, NULL },
 885        .tosec   = { ALL_EXIT_SECTIONS, NULL },
 886        .mismatch = TEXT_TO_ANY_EXIT,
 887        .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
 888},
 889{
 890        .fromsec = { DATA_SECTIONS, NULL },
 891        .tosec   = { ALL_EXIT_SECTIONS, NULL },
 892        .mismatch = DATA_TO_ANY_EXIT,
 893        .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
 894},
 895/* Do not reference init code/data from devinit/cpuinit/meminit code/data */
 896{
 897        .fromsec = { ALL_XXXINIT_SECTIONS, NULL },
 898        .tosec   = { INIT_SECTIONS, NULL },
 899        .mismatch = XXXINIT_TO_SOME_INIT,
 900        .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
 901},
 902/* Do not reference cpuinit code/data from meminit code/data */
 903{
 904        .fromsec = { MEM_INIT_SECTIONS, NULL },
 905        .tosec   = { CPU_INIT_SECTIONS, NULL },
 906        .mismatch = XXXINIT_TO_SOME_INIT,
 907        .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
 908},
 909/* Do not reference meminit code/data from cpuinit code/data */
 910{
 911        .fromsec = { CPU_INIT_SECTIONS, NULL },
 912        .tosec   = { MEM_INIT_SECTIONS, NULL },
 913        .mismatch = XXXINIT_TO_SOME_INIT,
 914        .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
 915},
 916/* Do not reference exit code/data from devexit/cpuexit/memexit code/data */
 917{
 918        .fromsec = { ALL_XXXEXIT_SECTIONS, NULL },
 919        .tosec   = { EXIT_SECTIONS, NULL },
 920        .mismatch = XXXEXIT_TO_SOME_EXIT,
 921        .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
 922},
 923/* Do not reference cpuexit code/data from memexit code/data */
 924{
 925        .fromsec = { MEM_EXIT_SECTIONS, NULL },
 926        .tosec   = { CPU_EXIT_SECTIONS, NULL },
 927        .mismatch = XXXEXIT_TO_SOME_EXIT,
 928        .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
 929},
 930/* Do not reference memexit code/data from cpuexit code/data */
 931{
 932        .fromsec = { CPU_EXIT_SECTIONS, NULL },
 933        .tosec   = { MEM_EXIT_SECTIONS, NULL },
 934        .mismatch = XXXEXIT_TO_SOME_EXIT,
 935        .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
 936},
 937/* Do not use exit code/data from init code */
 938{
 939        .fromsec = { ALL_INIT_SECTIONS, NULL },
 940        .tosec   = { ALL_EXIT_SECTIONS, NULL },
 941        .mismatch = ANY_INIT_TO_ANY_EXIT,
 942        .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
 943},
 944/* Do not use init code/data from exit code */
 945{
 946        .fromsec = { ALL_EXIT_SECTIONS, NULL },
 947        .tosec   = { ALL_INIT_SECTIONS, NULL },
 948        .mismatch = ANY_EXIT_TO_ANY_INIT,
 949        .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
 950},
 951/* Do not export init/exit functions or data */
 952{
 953        .fromsec = { "__ksymtab*", NULL },
 954        .tosec   = { INIT_SECTIONS, EXIT_SECTIONS, NULL },
 955        .mismatch = EXPORT_TO_INIT_EXIT,
 956        .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
 957}
 958};
 959
 960static const struct sectioncheck *section_mismatch(
 961                const char *fromsec, const char *tosec)
 962{
 963        int i;
 964        int elems = sizeof(sectioncheck) / sizeof(struct sectioncheck);
 965        const struct sectioncheck *check = &sectioncheck[0];
 966
 967        for (i = 0; i < elems; i++) {
 968                if (match(fromsec, check->fromsec) &&
 969                    match(tosec, check->tosec))
 970                        return check;
 971                check++;
 972        }
 973        return NULL;
 974}
 975
 976/**
 977 * Whitelist to allow certain references to pass with no warning.
 978 *
 979 * Pattern 1:
 980 *   If a module parameter is declared __initdata and permissions=0
 981 *   then this is legal despite the warning generated.
 982 *   We cannot see value of permissions here, so just ignore
 983 *   this pattern.
 984 *   The pattern is identified by:
 985 *   tosec   = .init.data
 986 *   fromsec = .data*
 987 *   atsym   =__param*
 988 *
 989 * Pattern 2:
 990 *   Many drivers utilise a *driver container with references to
 991 *   add, remove, probe functions etc.
 992 *   These functions may often be marked __devinit and we do not want to
 993 *   warn here.
 994 *   the pattern is identified by:
 995 *   tosec   = init or exit section
 996 *   fromsec = data section
 997 *   atsym = *driver, *_template, *_sht, *_ops, *_probe,
 998 *           *probe_one, *_console, *_timer
 999 *
1000 * Pattern 3:
1001 *   Whitelist all references from .head.text to any init section
1002 *
1003 * Pattern 4:
1004 *   Some symbols belong to init section but still it is ok to reference
1005 *   these from non-init sections as these symbols don't have any memory
1006 *   allocated for them and symbol address and value are same. So even
1007 *   if init section is freed, its ok to reference those symbols.
1008 *   For ex. symbols marking the init section boundaries.
1009 *   This pattern is identified by
1010 *   refsymname = __init_begin, _sinittext, _einittext
1011 *
1012 **/
1013static int secref_whitelist(const struct sectioncheck *mismatch,
1014                            const char *fromsec, const char *fromsym,
1015                            const char *tosec, const char *tosym)
1016{
1017        /* Check for pattern 1 */
1018        if (match(tosec, init_data_sections) &&
1019            match(fromsec, data_sections) &&
1020            (strncmp(fromsym, "__param", strlen("__param")) == 0))
1021                return 0;
1022
1023        /* Check for pattern 2 */
1024        if (match(tosec, init_exit_sections) &&
1025            match(fromsec, data_sections) &&
1026            match(fromsym, mismatch->symbol_white_list))
1027                return 0;
1028
1029        /* Check for pattern 3 */
1030        if (match(fromsec, head_sections) &&
1031            match(tosec, init_sections))
1032                return 0;
1033
1034        /* Check for pattern 4 */
1035        if (match(tosym, linker_symbols))
1036                return 0;
1037
1038        return 1;
1039}
1040
1041/**
1042 * Find symbol based on relocation record info.
1043 * In some cases the symbol supplied is a valid symbol so
1044 * return refsym. If st_name != 0 we assume this is a valid symbol.
1045 * In other cases the symbol needs to be looked up in the symbol table
1046 * based on section and address.
1047 *  **/
1048static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr,
1049                                Elf_Sym *relsym)
1050{
1051        Elf_Sym *sym;
1052        Elf_Sym *near = NULL;
1053        Elf64_Sword distance = 20;
1054        Elf64_Sword d;
1055
1056        if (relsym->st_name != 0)
1057                return relsym;
1058        for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
1059                if (sym->st_shndx != relsym->st_shndx)
1060                        continue;
1061                if (ELF_ST_TYPE(sym->st_info) == STT_SECTION)
1062                        continue;
1063                if (sym->st_value == addr)
1064                        return sym;
1065                /* Find a symbol nearby - addr are maybe negative */
1066                d = sym->st_value - addr;
1067                if (d < 0)
1068                        d = addr - sym->st_value;
1069                if (d < distance) {
1070                        distance = d;
1071                        near = sym;
1072                }
1073        }
1074        /* We need a close match */
1075        if (distance < 20)
1076                return near;
1077        else
1078                return NULL;
1079}
1080
1081static inline int is_arm_mapping_symbol(const char *str)
1082{
1083        return str[0] == '$' && strchr("atd", str[1])
1084               && (str[2] == '\0' || str[2] == '.');
1085}
1086
1087/*
1088 * If there's no name there, ignore it; likewise, ignore it if it's
1089 * one of the magic symbols emitted used by current ARM tools.
1090 *
1091 * Otherwise if find_symbols_between() returns those symbols, they'll
1092 * fail the whitelist tests and cause lots of false alarms ... fixable
1093 * only by merging __exit and __init sections into __text, bloating
1094 * the kernel (which is especially evil on embedded platforms).
1095 */
1096static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym)
1097{
1098        const char *name = elf->strtab + sym->st_name;
1099
1100        if (!name || !strlen(name))
1101                return 0;
1102        return !is_arm_mapping_symbol(name);
1103}
1104
1105/*
1106 * Find symbols before or equal addr and after addr - in the section sec.
1107 * If we find two symbols with equal offset prefer one with a valid name.
1108 * The ELF format may have a better way to detect what type of symbol
1109 * it is, but this works for now.
1110 **/
1111static Elf_Sym *find_elf_symbol2(struct elf_info *elf, Elf_Addr addr,
1112                                 const char *sec)
1113{
1114        Elf_Sym *sym;
1115        Elf_Sym *near = NULL;
1116        Elf_Addr distance = ~0;
1117
1118        for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
1119                const char *symsec;
1120
1121                if (sym->st_shndx >= SHN_LORESERVE)
1122                        continue;
1123                symsec = sec_name(elf, sym->st_shndx);
1124                if (strcmp(symsec, sec) != 0)
1125                        continue;
1126                if (!is_valid_name(elf, sym))
1127                        continue;
1128                if (sym->st_value <= addr) {
1129                        if ((addr - sym->st_value) < distance) {
1130                                distance = addr - sym->st_value;
1131                                near = sym;
1132                        } else if ((addr - sym->st_value) == distance) {
1133                                near = sym;
1134                        }
1135                }
1136        }
1137        return near;
1138}
1139
1140/*
1141 * Convert a section name to the function/data attribute
1142 * .init.text => __init
1143 * .cpuinit.data => __cpudata
1144 * .memexitconst => __memconst
1145 * etc.
1146*/
1147static char *sec2annotation(const char *s)
1148{
1149        if (match(s, init_exit_sections)) {
1150                char *p = malloc(20);
1151                char *r = p;
1152
1153                *p++ = '_';
1154                *p++ = '_';
1155                if (*s == '.')
1156                        s++;
1157                while (*s && *s != '.')
1158                        *p++ = *s++;
1159                *p = '\0';
1160                if (*s == '.')
1161                        s++;
1162                if (strstr(s, "rodata") != NULL)
1163                        strcat(p, "const ");
1164                else if (strstr(s, "data") != NULL)
1165                        strcat(p, "data ");
1166                else
1167                        strcat(p, " ");
1168                return r; /* we leak her but we do not care */
1169        } else {
1170                return "";
1171        }
1172}
1173
1174static int is_function(Elf_Sym *sym)
1175{
1176        if (sym)
1177                return ELF_ST_TYPE(sym->st_info) == STT_FUNC;
1178        else
1179                return -1;
1180}
1181
1182/*
1183 * Print a warning about a section mismatch.
1184 * Try to find symbols near it so user can find it.
1185 * Check whitelist before warning - it may be a false positive.
1186 */
1187static void report_sec_mismatch(const char *modname,
1188                                const struct sectioncheck *mismatch,
1189                                const char *fromsec,
1190                                unsigned long long fromaddr,
1191                                const char *fromsym,
1192                                int from_is_func,
1193                                const char *tosec, const char *tosym,
1194                                int to_is_func)
1195{
1196        const char *from, *from_p;
1197        const char *to, *to_p;
1198
1199        switch (from_is_func) {
1200        case 0: from = "variable"; from_p = "";   break;
1201        case 1: from = "function"; from_p = "()"; break;
1202        default: from = "(unknown reference)"; from_p = ""; break;
1203        }
1204        switch (to_is_func) {
1205        case 0: to = "variable"; to_p = "";   break;
1206        case 1: to = "function"; to_p = "()"; break;
1207        default: to = "(unknown reference)"; to_p = ""; break;
1208        }
1209
1210        sec_mismatch_count++;
1211        if (!sec_mismatch_verbose)
1212                return;
1213
1214        warn("%s(%s+0x%llx): Section mismatch in reference from the %s %s%s "
1215             "to the %s %s:%s%s\n",
1216             modname, fromsec, fromaddr, from, fromsym, from_p, to, tosec,
1217             tosym, to_p);
1218
1219        switch (mismatch->mismatch) {
1220        case TEXT_TO_ANY_INIT:
1221                fprintf(stderr,
1222                "The function %s%s() references\n"
1223                "the %s %s%s%s.\n"
1224                "This is often because %s lacks a %s\n"
1225                "annotation or the annotation of %s is wrong.\n",
1226                sec2annotation(fromsec), fromsym,
1227                to, sec2annotation(tosec), tosym, to_p,
1228                fromsym, sec2annotation(tosec), tosym);
1229                break;
1230        case DATA_TO_ANY_INIT: {
1231                const char *const *s = mismatch->symbol_white_list;
1232                fprintf(stderr,
1233                "The variable %s references\n"
1234                "the %s %s%s%s\n"
1235                "If the reference is valid then annotate the\n"
1236                "variable with __init* or __refdata (see linux/init.h) "
1237                "or name the variable:\n",
1238                fromsym, to, sec2annotation(tosec), tosym, to_p);
1239                while (*s)
1240                        fprintf(stderr, "%s, ", *s++);
1241                fprintf(stderr, "\n");
1242                break;
1243        }
1244        case TEXT_TO_ANY_EXIT:
1245                fprintf(stderr,
1246                "The function %s() references a %s in an exit section.\n"
1247                "Often the %s %s%s has valid usage outside the exit section\n"
1248                "and the fix is to remove the %sannotation of %s.\n",
1249                fromsym, to, to, tosym, to_p, sec2annotation(tosec), tosym);
1250                break;
1251        case DATA_TO_ANY_EXIT: {
1252                const char *const *s = mismatch->symbol_white_list;
1253                fprintf(stderr,
1254                "The variable %s references\n"
1255                "the %s %s%s%s\n"
1256                "If the reference is valid then annotate the\n"
1257                "variable with __exit* (see linux/init.h) or "
1258                "name the variable:\n",
1259                fromsym, to, sec2annotation(tosec), tosym, to_p);
1260                while (*s)
1261                        fprintf(stderr, "%s, ", *s++);
1262                fprintf(stderr, "\n");
1263                break;
1264        }
1265        case XXXINIT_TO_SOME_INIT:
1266        case XXXEXIT_TO_SOME_EXIT:
1267                fprintf(stderr,
1268                "The %s %s%s%s references\n"
1269                "a %s %s%s%s.\n"
1270                "If %s is only used by %s then\n"
1271                "annotate %s with a matching annotation.\n",
1272                from, sec2annotation(fromsec), fromsym, from_p,
1273                to, sec2annotation(tosec), tosym, to_p,
1274                tosym, fromsym, tosym);
1275                break;
1276        case ANY_INIT_TO_ANY_EXIT:
1277                fprintf(stderr,
1278                "The %s %s%s%s references\n"
1279                "a %s %s%s%s.\n"
1280                "This is often seen when error handling "
1281                "in the init function\n"
1282                "uses functionality in the exit path.\n"
1283                "The fix is often to remove the %sannotation of\n"
1284                "%s%s so it may be used outside an exit section.\n",
1285                from, sec2annotation(fromsec), fromsym, from_p,
1286                to, sec2annotation(tosec), tosym, to_p,
1287                sec2annotation(tosec), tosym, to_p);
1288                break;
1289        case ANY_EXIT_TO_ANY_INIT:
1290                fprintf(stderr,
1291                "The %s %s%s%s references\n"
1292                "a %s %s%s%s.\n"
1293                "This is often seen when error handling "
1294                "in the exit function\n"
1295                "uses functionality in the init path.\n"
1296                "The fix is often to remove the %sannotation of\n"
1297                "%s%s so it may be used outside an init section.\n",
1298                from, sec2annotation(fromsec), fromsym, from_p,
1299                to, sec2annotation(tosec), tosym, to_p,
1300                sec2annotation(tosec), tosym, to_p);
1301                break;
1302        case EXPORT_TO_INIT_EXIT:
1303                fprintf(stderr,
1304                "The symbol %s is exported and annotated %s\n"
1305                "Fix this by removing the %sannotation of %s "
1306                "or drop the export.\n",
1307                tosym, sec2annotation(tosec), sec2annotation(tosec), tosym);
1308                break;
1309        }
1310        fprintf(stderr, "\n");
1311}
1312
1313static void check_section_mismatch(const char *modname, struct elf_info *elf,
1314                                   Elf_Rela *r, Elf_Sym *sym, const char *fromsec)
1315{
1316        const char *tosec;
1317        const struct sectioncheck *mismatch;
1318
1319        tosec = sec_name(elf, sym->st_shndx);
1320        mismatch = section_mismatch(fromsec, tosec);
1321        if (mismatch) {
1322                Elf_Sym *to;
1323                Elf_Sym *from;
1324                const char *tosym;
1325                const char *fromsym;
1326
1327                from = find_elf_symbol2(elf, r->r_offset, fromsec);
1328                fromsym = sym_name(elf, from);
1329                to = find_elf_symbol(elf, r->r_addend, sym);
1330                tosym = sym_name(elf, to);
1331
1332                /* check whitelist - we may ignore it */
1333                if (secref_whitelist(mismatch,
1334                                        fromsec, fromsym, tosec, tosym)) {
1335                        report_sec_mismatch(modname, mismatch,
1336                           fromsec, r->r_offset, fromsym,
1337                           is_function(from), tosec, tosym,
1338                           is_function(to));
1339                }
1340        }
1341}
1342
1343static unsigned int *reloc_location(struct elf_info *elf,
1344                                    Elf_Shdr *sechdr, Elf_Rela *r)
1345{
1346        Elf_Shdr *sechdrs = elf->sechdrs;
1347        int section = sechdr->sh_info;
1348
1349        return (void *)elf->hdr + sechdrs[section].sh_offset +
1350                r->r_offset - sechdrs[section].sh_addr;
1351}
1352
1353static int addend_386_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1354{
1355        unsigned int r_typ = ELF_R_TYPE(r->r_info);
1356        unsigned int *location = reloc_location(elf, sechdr, r);
1357
1358        switch (r_typ) {
1359        case R_386_32:
1360                r->r_addend = TO_NATIVE(*location);
1361                break;
1362        case R_386_PC32:
1363                r->r_addend = TO_NATIVE(*location) + 4;
1364                /* For CONFIG_RELOCATABLE=y */
1365                if (elf->hdr->e_type == ET_EXEC)
1366                        r->r_addend += r->r_offset;
1367                break;
1368        }
1369        return 0;
1370}
1371
1372static int addend_arm_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1373{
1374        unsigned int r_typ = ELF_R_TYPE(r->r_info);
1375
1376        switch (r_typ) {
1377        case R_ARM_ABS32:
1378                /* From ARM ABI: (S + A) | T */
1379                r->r_addend = (int)(long)
1380                              (elf->symtab_start + ELF_R_SYM(r->r_info));
1381                break;
1382        case R_ARM_PC24:
1383                /* From ARM ABI: ((S + A) | T) - P */
1384                r->r_addend = (int)(long)(elf->hdr +
1385                              sechdr->sh_offset +
1386                              (r->r_offset - sechdr->sh_addr));
1387                break;
1388        default:
1389                return 1;
1390        }
1391        return 0;
1392}
1393
1394static int addend_mips_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1395{
1396        unsigned int r_typ = ELF_R_TYPE(r->r_info);
1397        unsigned int *location = reloc_location(elf, sechdr, r);
1398        unsigned int inst;
1399
1400        if (r_typ == R_MIPS_HI16)
1401                return 1;       /* skip this */
1402        inst = TO_NATIVE(*location);
1403        switch (r_typ) {
1404        case R_MIPS_LO16:
1405                r->r_addend = inst & 0xffff;
1406                break;
1407        case R_MIPS_26:
1408                r->r_addend = (inst & 0x03ffffff) << 2;
1409                break;
1410        case R_MIPS_32:
1411                r->r_addend = inst;
1412                break;
1413        }
1414        return 0;
1415}
1416
1417static void section_rela(const char *modname, struct elf_info *elf,
1418                         Elf_Shdr *sechdr)
1419{
1420        Elf_Sym  *sym;
1421        Elf_Rela *rela;
1422        Elf_Rela r;
1423        unsigned int r_sym;
1424        const char *fromsec;
1425
1426        Elf_Rela *start = (void *)elf->hdr + sechdr->sh_offset;
1427        Elf_Rela *stop  = (void *)start + sechdr->sh_size;
1428
1429        fromsec = sech_name(elf, sechdr);
1430        fromsec += strlen(".rela");
1431        /* if from section (name) is know good then skip it */
1432        if (match(fromsec, section_white_list))
1433                return;
1434
1435        for (rela = start; rela < stop; rela++) {
1436                r.r_offset = TO_NATIVE(rela->r_offset);
1437#if KERNEL_ELFCLASS == ELFCLASS64
1438                if (elf->hdr->e_machine == EM_MIPS) {
1439                        unsigned int r_typ;
1440                        r_sym = ELF64_MIPS_R_SYM(rela->r_info);
1441                        r_sym = TO_NATIVE(r_sym);
1442                        r_typ = ELF64_MIPS_R_TYPE(rela->r_info);
1443                        r.r_info = ELF64_R_INFO(r_sym, r_typ);
1444                } else {
1445                        r.r_info = TO_NATIVE(rela->r_info);
1446                        r_sym = ELF_R_SYM(r.r_info);
1447                }
1448#else
1449                r.r_info = TO_NATIVE(rela->r_info);
1450                r_sym = ELF_R_SYM(r.r_info);
1451#endif
1452                r.r_addend = TO_NATIVE(rela->r_addend);
1453                sym = elf->symtab_start + r_sym;
1454                /* Skip special sections */
1455                if (sym->st_shndx >= SHN_LORESERVE)
1456                        continue;
1457                check_section_mismatch(modname, elf, &r, sym, fromsec);
1458        }
1459}
1460
1461static void section_rel(const char *modname, struct elf_info *elf,
1462                        Elf_Shdr *sechdr)
1463{
1464        Elf_Sym *sym;
1465        Elf_Rel *rel;
1466        Elf_Rela r;
1467        unsigned int r_sym;
1468        const char *fromsec;
1469
1470        Elf_Rel *start = (void *)elf->hdr + sechdr->sh_offset;
1471        Elf_Rel *stop  = (void *)start + sechdr->sh_size;
1472
1473        fromsec = sech_name(elf, sechdr);
1474        fromsec += strlen(".rel");
1475        /* if from section (name) is know good then skip it */
1476        if (match(fromsec, section_white_list))
1477                return;
1478
1479        for (rel = start; rel < stop; rel++) {
1480                r.r_offset = TO_NATIVE(rel->r_offset);
1481#if KERNEL_ELFCLASS == ELFCLASS64
1482                if (elf->hdr->e_machine == EM_MIPS) {
1483                        unsigned int r_typ;
1484                        r_sym = ELF64_MIPS_R_SYM(rel->r_info);
1485                        r_sym = TO_NATIVE(r_sym);
1486                        r_typ = ELF64_MIPS_R_TYPE(rel->r_info);
1487                        r.r_info = ELF64_R_INFO(r_sym, r_typ);
1488                } else {
1489                        r.r_info = TO_NATIVE(rel->r_info);
1490                        r_sym = ELF_R_SYM(r.r_info);
1491                }
1492#else
1493                r.r_info = TO_NATIVE(rel->r_info);
1494                r_sym = ELF_R_SYM(r.r_info);
1495#endif
1496                r.r_addend = 0;
1497                switch (elf->hdr->e_machine) {
1498                case EM_386:
1499                        if (addend_386_rel(elf, sechdr, &r))
1500                                continue;
1501                        break;
1502                case EM_ARM:
1503                        if (addend_arm_rel(elf, sechdr, &r))
1504                                continue;
1505                        break;
1506                case EM_MIPS:
1507                        if (addend_mips_rel(elf, sechdr, &r))
1508                                continue;
1509                        break;
1510                }
1511                sym = elf->symtab_start + r_sym;
1512                /* Skip special sections */
1513                if (sym->st_shndx >= SHN_LORESERVE)
1514                        continue;
1515                check_section_mismatch(modname, elf, &r, sym, fromsec);
1516        }
1517}
1518
1519/**
1520 * A module includes a number of sections that are discarded
1521 * either when loaded or when used as built-in.
1522 * For loaded modules all functions marked __init and all data
1523 * marked __initdata will be discarded when the module has been intialized.
1524 * Likewise for modules used built-in the sections marked __exit
1525 * are discarded because __exit marked function are supposed to be called
1526 * only when a module is unloaded which never happens for built-in modules.
1527 * The check_sec_ref() function traverses all relocation records
1528 * to find all references to a section that reference a section that will
1529 * be discarded and warns about it.
1530 **/
1531static void check_sec_ref(struct module *mod, const char *modname,
1532                          struct elf_info *elf)
1533{
1534        int i;
1535        Elf_Shdr *sechdrs = elf->sechdrs;
1536
1537        /* Walk through all sections */
1538        for (i = 0; i < elf->hdr->e_shnum; i++) {
1539                check_section(modname, elf, &elf->sechdrs[i]);
1540                /* We want to process only relocation sections and not .init */
1541                if (sechdrs[i].sh_type == SHT_RELA)
1542                        section_rela(modname, elf, &elf->sechdrs[i]);
1543                else if (sechdrs[i].sh_type == SHT_REL)
1544                        section_rel(modname, elf, &elf->sechdrs[i]);
1545        }
1546}
1547
1548static void read_symbols(char *modname)
1549{
1550        const char *symname;
1551        char *version;
1552        char *license;
1553        struct module *mod;
1554        struct elf_info info = { };
1555        Elf_Sym *sym;
1556
1557        if (!parse_elf(&info, modname))
1558                return;
1559
1560        mod = new_module(modname);
1561
1562        /* When there's no vmlinux, don't print warnings about
1563         * unresolved symbols (since there'll be too many ;) */
1564        if (is_vmlinux(modname)) {
1565                have_vmlinux = 1;
1566                mod->skip = 1;
1567        }
1568
1569        license = get_modinfo(info.modinfo, info.modinfo_len, "license");
1570        if (info.modinfo && !license && !is_vmlinux(modname))
1571                warn("modpost: missing MODULE_LICENSE() in %s\n"
1572                     "see include/linux/module.h for "
1573                     "more information\n", modname);
1574        while (license) {
1575                if (license_is_gpl_compatible(license))
1576                        mod->gpl_compatible = 1;
1577                else {
1578                        mod->gpl_compatible = 0;
1579                        break;
1580                }
1581                license = get_next_modinfo(info.modinfo, info.modinfo_len,
1582                                           "license", license);
1583        }
1584
1585        for (sym = info.symtab_start; sym < info.symtab_stop; sym++) {
1586                symname = info.strtab + sym->st_name;
1587
1588                handle_modversions(mod, &info, sym, symname);
1589                handle_moddevtable(mod, &info, sym, symname);
1590        }
1591        if (!is_vmlinux(modname) ||
1592             (is_vmlinux(modname) && vmlinux_section_warnings))
1593                check_sec_ref(mod, modname, &info);
1594
1595        version = get_modinfo(info.modinfo, info.modinfo_len, "version");
1596        if (version)
1597                maybe_frob_rcs_version(modname, version, info.modinfo,
1598                                       version - (char *)info.hdr);
1599        if (version || (all_versions && !is_vmlinux(modname)))
1600                get_src_version(modname, mod->srcversion,
1601                                sizeof(mod->srcversion)-1);
1602
1603        parse_elf_finish(&info);
1604
1605        /* Our trick to get versioning for module struct etc. - it's
1606         * never passed as an argument to an exported function, so
1607         * the automatic versioning doesn't pick it up, but it's really
1608         * important anyhow */
1609        if (modversions)
1610                mod->unres = alloc_symbol("module_layout", 0, mod->unres);
1611}
1612
1613#define SZ 500
1614
1615/* We first write the generated file into memory using the
1616 * following helper, then compare to the file on disk and
1617 * only update the later if anything changed */
1618
1619void __attribute__((format(printf, 2, 3))) buf_printf(struct buffer *buf,
1620                                                      const char *fmt, ...)
1621{
1622        char tmp[SZ];
1623        int len;
1624        va_list ap;
1625
1626        va_start(ap, fmt);
1627        len = vsnprintf(tmp, SZ, fmt, ap);
1628        buf_write(buf, tmp, len);
1629        va_end(ap);
1630}
1631
1632void buf_write(struct buffer *buf, const char *s, int len)
1633{
1634        if (buf->size - buf->pos < len) {
1635                buf->size += len + SZ;
1636                buf->p = realloc(buf->p, buf->size);
1637        }
1638        strncpy(buf->p + buf->pos, s, len);
1639        buf->pos += len;
1640}
1641
1642static void check_for_gpl_usage(enum export exp, const char *m, const char *s)
1643{
1644        const char *e = is_vmlinux(m) ?"":".ko";
1645
1646        switch (exp) {
1647        case export_gpl:
1648                fatal("modpost: GPL-incompatible module %s%s "
1649                      "uses GPL-only symbol '%s'\n", m, e, s);
1650                break;
1651        case export_unused_gpl:
1652                fatal("modpost: GPL-incompatible module %s%s "
1653                      "uses GPL-only symbol marked UNUSED '%s'\n", m, e, s);
1654                break;
1655        case export_gpl_future:
1656                warn("modpost: GPL-incompatible module %s%s "
1657                      "uses future GPL-only symbol '%s'\n", m, e, s);
1658                break;
1659        case export_plain:
1660        case export_unused:
1661        case export_unknown:
1662                /* ignore */
1663                break;
1664        }
1665}
1666
1667static void check_for_unused(enum export exp, const char *m, const char *s)
1668{
1669        const char *e = is_vmlinux(m) ?"":".ko";
1670
1671        switch (exp) {
1672        case export_unused:
1673        case export_unused_gpl:
1674                warn("modpost: module %s%s "
1675                      "uses symbol '%s' marked UNUSED\n", m, e, s);
1676                break;
1677        default:
1678                /* ignore */
1679                break;
1680        }
1681}
1682
1683static void check_exports(struct module *mod)
1684{
1685        struct symbol *s, *exp;
1686
1687        for (s = mod->unres; s; s = s->next) {
1688                const char *basename;
1689                exp = find_symbol(s->name);
1690                if (!exp || exp->module == mod)
1691                        continue;
1692                basename = strrchr(mod->name, '/');
1693                if (basename)
1694                        basename++;
1695                else
1696                        basename = mod->name;
1697                if (!mod->gpl_compatible)
1698                        check_for_gpl_usage(exp->export, basename, exp->name);
1699                check_for_unused(exp->export, basename, exp->name);
1700        }
1701}
1702
1703/**
1704 * Header for the generated file
1705 **/
1706static void add_header(struct buffer *b, struct module *mod)
1707{
1708        buf_printf(b, "#include <linux/module.h>\n");
1709        buf_printf(b, "#include <linux/vermagic.h>\n");
1710        buf_printf(b, "#include <linux/compiler.h>\n");
1711        buf_printf(b, "\n");
1712        buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n");
1713        buf_printf(b, "\n");
1714        buf_printf(b, "struct module __this_module\n");
1715        buf_printf(b, "__attribute__((section(\".gnu.linkonce.this_module\"))) = {\n");
1716        buf_printf(b, " .name = KBUILD_MODNAME,\n");
1717        if (mod->has_init)
1718                buf_printf(b, " .init = init_module,\n");
1719        if (mod->has_cleanup)
1720                buf_printf(b, "#ifdef CONFIG_MODULE_UNLOAD\n"
1721                              " .exit = cleanup_module,\n"
1722                              "#endif\n");
1723        buf_printf(b, " .arch = MODULE_ARCH_INIT,\n");
1724        buf_printf(b, "};\n");
1725}
1726
1727static void add_staging_flag(struct buffer *b, const char *name)
1728{
1729        static const char *staging_dir = "drivers/staging";
1730
1731        if (strncmp(staging_dir, name, strlen(staging_dir)) == 0)
1732                buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n");
1733}
1734
1735/**
1736 * Record CRCs for unresolved symbols
1737 **/
1738static int add_versions(struct buffer *b, struct module *mod)
1739{
1740        struct symbol *s, *exp;
1741        int err = 0;
1742
1743        for (s = mod->unres; s; s = s->next) {
1744                exp = find_symbol(s->name);
1745                if (!exp || exp->module == mod) {
1746                        if (have_vmlinux && !s->weak) {
1747                                if (warn_unresolved) {
1748                                        warn("\"%s\" [%s.ko] undefined!\n",
1749                                             s->name, mod->name);
1750                                } else {
1751                                        merror("\"%s\" [%s.ko] undefined!\n",
1752                                                  s->name, mod->name);
1753                                        err = 1;
1754                                }
1755                        }
1756                        continue;
1757                }
1758                s->module = exp->module;
1759                s->crc_valid = exp->crc_valid;
1760                s->crc = exp->crc;
1761        }
1762
1763        if (!modversions)
1764                return err;
1765
1766        buf_printf(b, "\n");
1767        buf_printf(b, "static const struct modversion_info ____versions[]\n");
1768        buf_printf(b, "__used\n");
1769        buf_printf(b, "__attribute__((section(\"__versions\"))) = {\n");
1770
1771        for (s = mod->unres; s; s = s->next) {
1772                if (!s->module)
1773                        continue;
1774                if (!s->crc_valid) {
1775                        warn("\"%s\" [%s.ko] has no CRC!\n",
1776                                s->name, mod->name);
1777                        continue;
1778                }
1779                buf_printf(b, "\t{ %#8x, \"%s\" },\n", s->crc, s->name);
1780        }
1781
1782        buf_printf(b, "};\n");
1783
1784        return err;
1785}
1786
1787static void add_depends(struct buffer *b, struct module *mod,
1788                        struct module *modules)
1789{
1790        struct symbol *s;
1791        struct module *m;
1792        int first = 1;
1793
1794        for (m = modules; m; m = m->next)
1795                m->seen = is_vmlinux(m->name);
1796
1797        buf_printf(b, "\n");
1798        buf_printf(b, "static const char __module_depends[]\n");
1799        buf_printf(b, "__used\n");
1800        buf_printf(b, "__attribute__((section(\".modinfo\"))) =\n");
1801        buf_printf(b, "\"depends=");
1802        for (s = mod->unres; s; s = s->next) {
1803                const char *p;
1804                if (!s->module)
1805                        continue;
1806
1807                if (s->module->seen)
1808                        continue;
1809
1810                s->module->seen = 1;
1811                p = strrchr(s->module->name, '/');
1812                if (p)
1813                        p++;
1814                else
1815                        p = s->module->name;
1816                buf_printf(b, "%s%s", first ? "" : ",", p);
1817                first = 0;
1818        }
1819        buf_printf(b, "\";\n");
1820}
1821
1822static void add_srcversion(struct buffer *b, struct module *mod)
1823{
1824        if (mod->srcversion[0]) {
1825                buf_printf(b, "\n");
1826                buf_printf(b, "MODULE_INFO(srcversion, \"%s\");\n",
1827                           mod->srcversion);
1828        }
1829}
1830
1831static void write_if_changed(struct buffer *b, const char *fname)
1832{
1833        char *tmp;
1834        FILE *file;
1835        struct stat st;
1836
1837        file = fopen(fname, "r");
1838        if (!file)
1839                goto write;
1840
1841        if (fstat(fileno(file), &st) < 0)
1842                goto close_write;
1843
1844        if (st.st_size != b->pos)
1845                goto close_write;
1846
1847        tmp = NOFAIL(malloc(b->pos));
1848        if (fread(tmp, 1, b->pos, file) != b->pos)
1849                goto free_write;
1850
1851        if (memcmp(tmp, b->p, b->pos) != 0)
1852                goto free_write;
1853
1854        free(tmp);
1855        fclose(file);
1856        return;
1857
1858 free_write:
1859        free(tmp);
1860 close_write:
1861        fclose(file);
1862 write:
1863        file = fopen(fname, "w");
1864        if (!file) {
1865                perror(fname);
1866                exit(1);
1867        }
1868        if (fwrite(b->p, 1, b->pos, file) != b->pos) {
1869                perror(fname);
1870                exit(1);
1871        }
1872        fclose(file);
1873}
1874
1875/* parse Module.symvers file. line format:
1876 * 0x12345678<tab>symbol<tab>module[[<tab>export]<tab>something]
1877 **/
1878static void read_dump(const char *fname, unsigned int kernel)
1879{
1880        unsigned long size, pos = 0;
1881        void *file = grab_file(fname, &size);
1882        char *line;
1883
1884        if (!file)
1885                /* No symbol versions, silently ignore */
1886                return;
1887
1888        while ((line = get_next_line(&pos, file, size))) {
1889                char *symname, *modname, *d, *export, *end;
1890                unsigned int crc;
1891                struct module *mod;
1892                struct symbol *s;
1893
1894                if (!(symname = strchr(line, '\t')))
1895                        goto fail;
1896                *symname++ = '\0';
1897                if (!(modname = strchr(symname, '\t')))
1898                        goto fail;
1899                *modname++ = '\0';
1900                if ((export = strchr(modname, '\t')) != NULL)
1901                        *export++ = '\0';
1902                if (export && ((end = strchr(export, '\t')) != NULL))
1903                        *end = '\0';
1904                crc = strtoul(line, &d, 16);
1905                if (*symname == '\0' || *modname == '\0' || *d != '\0')
1906                        goto fail;
1907                mod = find_module(modname);
1908                if (!mod) {
1909                        if (is_vmlinux(modname))
1910                                have_vmlinux = 1;
1911                        mod = new_module(modname);
1912                        mod->skip = 1;
1913                }
1914                s = sym_add_exported(symname, mod, export_no(export));
1915                s->kernel    = kernel;
1916                s->preloaded = 1;
1917                sym_update_crc(symname, mod, crc, export_no(export));
1918        }
1919        return;
1920fail:
1921        fatal("parse error in symbol dump file\n");
1922}
1923
1924/* For normal builds always dump all symbols.
1925 * For external modules only dump symbols
1926 * that are not read from kernel Module.symvers.
1927 **/
1928static int dump_sym(struct symbol *sym)
1929{
1930        if (!external_module)
1931                return 1;
1932        if (sym->vmlinux || sym->kernel)
1933                return 0;
1934        return 1;
1935}
1936
1937static void write_dump(const char *fname)
1938{
1939        struct buffer buf = { };
1940        struct symbol *symbol;
1941        int n;
1942
1943        for (n = 0; n < SYMBOL_HASH_SIZE ; n++) {
1944                symbol = symbolhash[n];
1945                while (symbol) {
1946                        if (dump_sym(symbol))
1947                                buf_printf(&buf, "0x%08x\t%s\t%s\t%s\n",
1948                                        symbol->crc, symbol->name,
1949                                        symbol->module->name,
1950                                        export_str(symbol->export));
1951                        symbol = symbol->next;
1952                }
1953        }
1954        write_if_changed(&buf, fname);
1955}
1956
1957struct ext_sym_list {
1958        struct ext_sym_list *next;
1959        const char *file;
1960};
1961
1962int main(int argc, char **argv)
1963{
1964        struct module *mod;
1965        struct buffer buf = { };
1966        char *kernel_read = NULL, *module_read = NULL;
1967        char *dump_write = NULL;
1968        int opt;
1969        int err;
1970        struct ext_sym_list *extsym_iter;
1971        struct ext_sym_list *extsym_start = NULL;
1972
1973        while ((opt = getopt(argc, argv, "i:I:e:cmsSo:awM:K:")) != -1) {
1974                switch (opt) {
1975                case 'i':
1976                        kernel_read = optarg;
1977                        break;
1978                case 'I':
1979                        module_read = optarg;
1980                        external_module = 1;
1981                        break;
1982                case 'c':
1983                        cross_build = 1;
1984                        break;
1985                case 'e':
1986                        external_module = 1;
1987                        extsym_iter =
1988                           NOFAIL(malloc(sizeof(*extsym_iter)));
1989                        extsym_iter->next = extsym_start;
1990                        extsym_iter->file = optarg;
1991                        extsym_start = extsym_iter;
1992                        break;
1993                case 'm':
1994                        modversions = 1;
1995                        break;
1996                case 'o':
1997                        dump_write = optarg;
1998                        break;
1999                case 'a':
2000                        all_versions = 1;
2001                        break;
2002                case 's':
2003                        vmlinux_section_warnings = 0;
2004                        break;
2005                case 'S':
2006                        sec_mismatch_verbose = 0;
2007                        break;
2008                case 'w':
2009                        warn_unresolved = 1;
2010                        break;
2011                default:
2012                        exit(1);
2013                }
2014        }
2015
2016        if (kernel_read)
2017                read_dump(kernel_read, 1);
2018        if (module_read)
2019                read_dump(module_read, 0);
2020        while (extsym_start) {
2021                read_dump(extsym_start->file, 0);
2022                extsym_iter = extsym_start->next;
2023                free(extsym_start);
2024                extsym_start = extsym_iter;
2025        }
2026
2027        while (optind < argc)
2028                read_symbols(argv[optind++]);
2029
2030        for (mod = modules; mod; mod = mod->next) {
2031                if (mod->skip)
2032                        continue;
2033                check_exports(mod);
2034        }
2035
2036        err = 0;
2037
2038        for (mod = modules; mod; mod = mod->next) {
2039                char fname[strlen(mod->name) + 10];
2040
2041                if (mod->skip)
2042                        continue;
2043
2044                buf.pos = 0;
2045
2046                add_header(&buf, mod);
2047                add_staging_flag(&buf, mod->name);
2048                err |= add_versions(&buf, mod);
2049                add_depends(&buf, mod, modules);
2050                add_moddevtable(&buf, mod);
2051                add_srcversion(&buf, mod);
2052
2053                sprintf(fname, "%s.mod.c", mod->name);
2054                write_if_changed(&buf, fname);
2055        }
2056
2057        if (dump_write)
2058                write_dump(dump_write);
2059        if (sec_mismatch_count && !sec_mismatch_verbose)
2060                warn("modpost: Found %d section mismatch(es).\n"
2061                     "To see full details build your kernel with:\n"
2062                     "'make CONFIG_DEBUG_SECTION_MISMATCH=y'\n",
2063                     sec_mismatch_count);
2064
2065        return err;
2066}
2067
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.