Linux Audio

Check our new training course

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