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