Linux Audio

Check our new training course

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