Linux Audio

Check our new training course

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