modpost.c 55.1 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4
/* Postprocess module symbol versions
 *
 * Copyright 2003       Kai Germaschewski
 * Copyright 2002-2004  Rusty Russell, IBM Corporation
S
Sam Ravnborg 已提交
5
 * Copyright 2006-2008  Sam Ravnborg
L
Linus Torvalds 已提交
6 7 8 9 10 11 12 13
 * Based in part on module-init-tools/depmod.c,file2alias
 *
 * This software may be used and distributed according to the terms
 * of the GNU General Public License, incorporated herein by reference.
 *
 * Usage: modpost vmlinux module1.o module2.o ...
 */

14 15
#define _GNU_SOURCE
#include <stdio.h>
L
Linus Torvalds 已提交
16
#include <ctype.h>
17
#include <string.h>
L
Linus Torvalds 已提交
18
#include "modpost.h"
19
#include "../../include/generated/autoconf.h"
20
#include "../../include/linux/license.h"
L
Linus Torvalds 已提交
21

22 23 24 25 26 27 28 29
/* Some toolchains use a `_' prefix for all user symbols. */
#ifdef CONFIG_SYMBOL_PREFIX
#define MODULE_SYMBOL_PREFIX CONFIG_SYMBOL_PREFIX
#else
#define MODULE_SYMBOL_PREFIX ""
#endif


L
Linus Torvalds 已提交
30 31 32 33 34 35
/* Are we using CONFIG_MODVERSIONS? */
int modversions = 0;
/* Warn about undefined symbols? (do so if we have vmlinux) */
int have_vmlinux = 0;
/* Is CONFIG_MODULE_SRCVERSION_ALL set? */
static int all_versions = 0;
36 37
/* If we are modposting external module set to 1 */
static int external_module = 0;
38 39
/* Warn about section mismatch in vmlinux if set to 1 */
static int vmlinux_section_warnings = 1;
40 41
/* Only warn about unresolved symbols */
static int warn_unresolved = 0;
42
/* How a symbol is exported */
43 44 45
static int sec_mismatch_count = 0;
static int sec_mismatch_verbose = 1;

46 47 48 49
enum export {
	export_plain,      export_unused,     export_gpl,
	export_unused_gpl, export_gpl_future, export_unknown
};
L
Linus Torvalds 已提交
50

51 52 53
#define PRINTF __attribute__ ((format (printf, 1, 2)))

PRINTF void fatal(const char *fmt, ...)
L
Linus Torvalds 已提交
54 55 56 57 58 59 60 61 62 63 64 65
{
	va_list arglist;

	fprintf(stderr, "FATAL: ");

	va_start(arglist, fmt);
	vfprintf(stderr, fmt, arglist);
	va_end(arglist);

	exit(1);
}

66
PRINTF void warn(const char *fmt, ...)
L
Linus Torvalds 已提交
67 68 69 70 71 72 73 74 75 76
{
	va_list arglist;

	fprintf(stderr, "WARNING: ");

	va_start(arglist, fmt);
	vfprintf(stderr, fmt, arglist);
	va_end(arglist);
}

77
PRINTF void merror(const char *fmt, ...)
78 79 80 81 82 83 84 85 86 87
{
	va_list arglist;

	fprintf(stderr, "ERROR: ");

	va_start(arglist, fmt);
	vfprintf(stderr, fmt, arglist);
	va_end(arglist);
}

88 89 90 91
static int is_vmlinux(const char *modname)
{
	const char *myname;

S
Sam Ravnborg 已提交
92 93
	myname = strrchr(modname, '/');
	if (myname)
94 95 96 97
		myname++;
	else
		myname = modname;

98 99
	return (strcmp(myname, "vmlinux") == 0) ||
	       (strcmp(myname, "vmlinux.o") == 0);
100 101
}

L
Linus Torvalds 已提交
102 103
void *do_nofail(void *ptr, const char *expr)
{
S
Sam Ravnborg 已提交
104
	if (!ptr)
L
Linus Torvalds 已提交
105
		fatal("modpost: Memory allocation failure: %s.\n", expr);
S
Sam Ravnborg 已提交
106

L
Linus Torvalds 已提交
107 108 109 110 111 112
	return ptr;
}

/* A list of all modules we processed */
static struct module *modules;

113
static struct module *find_module(char *modname)
L
Linus Torvalds 已提交
114 115 116 117 118 119 120 121 122
{
	struct module *mod;

	for (mod = modules; mod; mod = mod->next)
		if (strcmp(mod->name, modname) == 0)
			break;
	return mod;
}

123
static struct module *new_module(char *modname)
L
Linus Torvalds 已提交
124 125 126
{
	struct module *mod;
	char *p, *s;
127

L
Linus Torvalds 已提交
128 129 130 131 132
	mod = NOFAIL(malloc(sizeof(*mod)));
	memset(mod, 0, sizeof(*mod));
	p = NOFAIL(strdup(modname));

	/* strip trailing .o */
S
Sam Ravnborg 已提交
133 134
	s = strrchr(p, '.');
	if (s != NULL)
L
Linus Torvalds 已提交
135 136 137 138 139
		if (strcmp(s, ".o") == 0)
			*s = '\0';

	/* add to list */
	mod->name = p;
140
	mod->gpl_compatible = -1;
L
Linus Torvalds 已提交
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
	mod->next = modules;
	modules = mod;

	return mod;
}

/* A hash of all exported symbols,
 * struct symbol is also used for lists of unresolved symbols */

#define SYMBOL_HASH_SIZE 1024

struct symbol {
	struct symbol *next;
	struct module *module;
	unsigned int crc;
	int crc_valid;
	unsigned int weak:1;
158 159 160
	unsigned int vmlinux:1;    /* 1 if symbol is defined in vmlinux */
	unsigned int kernel:1;     /* 1 if symbol is from kernel
				    *  (only for external modules) **/
161
	unsigned int preloaded:1;  /* 1 if symbol from Module.symvers */
162
	enum export  export;       /* Type of export */
L
Linus Torvalds 已提交
163 164 165 166 167 168 169 170 171 172 173 174
	char name[0];
};

static struct symbol *symbolhash[SYMBOL_HASH_SIZE];

/* This is based on the hash agorithm from gdbm, via tdb */
static inline unsigned int tdb_hash(const char *name)
{
	unsigned value;	/* Used to compute the hash value.  */
	unsigned   i;	/* Used to cycle through random values. */

	/* Set the initial value from the key size. */
S
Sam Ravnborg 已提交
175
	for (value = 0x238F13AF * strlen(name), i = 0; name[i]; i++)
L
Linus Torvalds 已提交
176 177 178 179 180
		value = (value + (((unsigned char *)name)[i] << (i*5 % 24)));

	return (1103515243 * value + 12345);
}

181 182 183 184 185 186
/**
 * Allocate a new symbols for use in the hash of exported symbols or
 * the list of unresolved symbols per module
 **/
static struct symbol *alloc_symbol(const char *name, unsigned int weak,
				   struct symbol *next)
L
Linus Torvalds 已提交
187 188 189 190 191 192 193 194 195 196 197
{
	struct symbol *s = NOFAIL(malloc(sizeof(*s) + strlen(name) + 1));

	memset(s, 0, sizeof(*s));
	strcpy(s->name, name);
	s->weak = weak;
	s->next = next;
	return s;
}

/* For the hash of exported symbols */
198 199
static struct symbol *new_symbol(const char *name, struct module *module,
				 enum export export)
L
Linus Torvalds 已提交
200 201 202 203 204 205 206
{
	unsigned int hash;
	struct symbol *new;

	hash = tdb_hash(name) % SYMBOL_HASH_SIZE;
	new = symbolhash[hash] = alloc_symbol(name, 0, symbolhash[hash]);
	new->module = module;
207
	new->export = export;
208
	return new;
L
Linus Torvalds 已提交
209 210
}

211
static struct symbol *find_symbol(const char *name)
L
Linus Torvalds 已提交
212 213 214 215 216 217 218
{
	struct symbol *s;

	/* For our purposes, .foo matches foo.  PPC64 needs this. */
	if (name[0] == '.')
		name++;

S
Sam Ravnborg 已提交
219
	for (s = symbolhash[tdb_hash(name) % SYMBOL_HASH_SIZE]; s; s = s->next) {
L
Linus Torvalds 已提交
220 221 222 223 224 225
		if (strcmp(s->name, name) == 0)
			return s;
	}
	return NULL;
}

226 227 228 229 230
static struct {
	const char *str;
	enum export export;
} export_list[] = {
	{ .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 235 236 237 238 239 240 241 242 243
	{ .str = "EXPORT_SYMBOL_GPL_FUTURE", .export = export_gpl_future },
	{ .str = "(unknown)",                .export = export_unknown },
};


static const char *export_str(enum export ex)
{
	return export_list[ex].str;
}

S
Sam Ravnborg 已提交
244
static enum export export_no(const char *s)
245 246
{
	int i;
S
Sam Ravnborg 已提交
247

S
Sam Ravnborg 已提交
248 249
	if (!s)
		return export_unknown;
250 251 252 253 254 255 256
	for (i = 0; export_list[i].export != export_unknown; i++) {
		if (strcmp(export_list[i].str, s) == 0)
			return export_list[i].export;
	}
	return export_unknown;
}

257
static enum export export_from_sec(struct elf_info *elf, unsigned int sec)
258 259 260
{
	if (sec == elf->export_sec)
		return export_plain;
261 262
	else if (sec == elf->export_unused_sec)
		return export_unused;
263 264
	else if (sec == elf->export_gpl_sec)
		return export_gpl;
265 266
	else if (sec == elf->export_unused_gpl_sec)
		return export_unused_gpl;
267 268 269 270 271 272
	else if (sec == elf->export_gpl_future_sec)
		return export_gpl_future;
	else
		return export_unknown;
}

273 274 275 276
/**
 * Add an exported symbol - it may have already been added without a
 * CRC, in this case just update the CRC
 **/
277 278
static struct symbol *sym_add_exported(const char *name, struct module *mod,
				       enum export export)
L
Linus Torvalds 已提交
279 280 281 282
{
	struct symbol *s = find_symbol(name);

	if (!s) {
283
		s = new_symbol(name, mod, export);
284 285
	} else {
		if (!s->preloaded) {
286
			warn("%s: '%s' exported twice. Previous export "
287 288 289
			     "was in %s%s\n", mod->name, name,
			     s->module->name,
			     is_vmlinux(s->module->name) ?"":".ko");
290 291 292
		} else {
			/* In case Modules.symvers was out of date */
			s->module = mod;
293
		}
L
Linus Torvalds 已提交
294
	}
295
	s->preloaded = 0;
296 297
	s->vmlinux   = is_vmlinux(mod->name);
	s->kernel    = 0;
298
	s->export    = export;
299 300 301 302
	return s;
}

static void sym_update_crc(const char *name, struct module *mod,
303
			   unsigned int crc, enum export export)
304 305 306 307
{
	struct symbol *s = find_symbol(name);

	if (!s)
308
		s = new_symbol(name, mod, export);
309 310
	s->crc = crc;
	s->crc_valid = 1;
L
Linus Torvalds 已提交
311 312
}

313
void *grab_file(const char *filename, unsigned long *size)
L
Linus Torvalds 已提交
314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331
{
	struct stat st;
	void *map;
	int fd;

	fd = open(filename, O_RDONLY);
	if (fd < 0 || fstat(fd, &st) != 0)
		return NULL;

	*size = st.st_size;
	map = mmap(NULL, *size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
	close(fd);

	if (map == MAP_FAILED)
		return NULL;
	return map;
}

332 333 334 335 336
/**
  * Return a copy of the next line in a mmap'ed file.
  * spaces in the beginning of the line is trimmed away.
  * Return a pointer to a static buffer.
  **/
S
Sam Ravnborg 已提交
337
char *get_next_line(unsigned long *pos, void *file, unsigned long size)
L
Linus Torvalds 已提交
338 339 340 341 342 343 344
{
	static char line[4096];
	int skip = 1;
	size_t len = 0;
	signed char *p = (signed char *)file + *pos;
	char *s = line;

S
Sam Ravnborg 已提交
345
	for (; *pos < size ; (*pos)++) {
L
Linus Torvalds 已提交
346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365
		if (skip && isspace(*p)) {
			p++;
			continue;
		}
		skip = 0;
		if (*p != '\n' && (*pos < size)) {
			len++;
			*s++ = *p++;
			if (len > 4095)
				break; /* Too long, stop */
		} else {
			/* End of string */
			*s = '\0';
			return line;
		}
	}
	/* End of buffer */
	return NULL;
}

366
void release_file(void *file, unsigned long size)
L
Linus Torvalds 已提交
367 368 369 370
{
	munmap(file, size);
}

371
static int parse_elf(struct elf_info *info, const char *filename)
L
Linus Torvalds 已提交
372 373
{
	unsigned int i;
374
	Elf_Ehdr *hdr;
L
Linus Torvalds 已提交
375 376
	Elf_Shdr *sechdrs;
	Elf_Sym  *sym;
377 378
	const char *secstrings;
	unsigned int symtab_idx = ~0U, symtab_shndx_idx = ~0U;
L
Linus Torvalds 已提交
379 380 381 382

	hdr = grab_file(filename, &info->size);
	if (!hdr) {
		perror(filename);
383
		exit(1);
L
Linus Torvalds 已提交
384 385
	}
	info->hdr = hdr;
386 387 388 389 390 391 392 393 394 395 396 397
	if (info->size < sizeof(*hdr)) {
		/* file too small, assume this is an empty .o file */
		return 0;
	}
	/* Is this a valid ELF file? */
	if ((hdr->e_ident[EI_MAG0] != ELFMAG0) ||
	    (hdr->e_ident[EI_MAG1] != ELFMAG1) ||
	    (hdr->e_ident[EI_MAG2] != ELFMAG2) ||
	    (hdr->e_ident[EI_MAG3] != ELFMAG3)) {
		/* Not an ELF file - silently ignore it */
		return 0;
	}
L
Linus Torvalds 已提交
398
	/* Fix endianness in ELF header */
399 400 401 402 403 404 405 406 407 408 409 410 411
	hdr->e_type      = TO_NATIVE(hdr->e_type);
	hdr->e_machine   = TO_NATIVE(hdr->e_machine);
	hdr->e_version   = TO_NATIVE(hdr->e_version);
	hdr->e_entry     = TO_NATIVE(hdr->e_entry);
	hdr->e_phoff     = TO_NATIVE(hdr->e_phoff);
	hdr->e_shoff     = TO_NATIVE(hdr->e_shoff);
	hdr->e_flags     = TO_NATIVE(hdr->e_flags);
	hdr->e_ehsize    = TO_NATIVE(hdr->e_ehsize);
	hdr->e_phentsize = TO_NATIVE(hdr->e_phentsize);
	hdr->e_phnum     = TO_NATIVE(hdr->e_phnum);
	hdr->e_shentsize = TO_NATIVE(hdr->e_shentsize);
	hdr->e_shnum     = TO_NATIVE(hdr->e_shnum);
	hdr->e_shstrndx  = TO_NATIVE(hdr->e_shstrndx);
L
Linus Torvalds 已提交
412 413 414
	sechdrs = (void *)hdr + hdr->e_shoff;
	info->sechdrs = sechdrs;

P
Petr Stetiar 已提交
415 416
	/* Check if file offset is correct */
	if (hdr->e_shoff > info->size) {
S
Sam Ravnborg 已提交
417 418 419
		fatal("section header offset=%lu in file '%s' is bigger than "
		      "filesize=%lu\n", (unsigned long)hdr->e_shoff,
		      filename, info->size);
P
Petr Stetiar 已提交
420 421 422
		return 0;
	}

423
	if (hdr->e_shnum == SHN_UNDEF) {
424 425 426 427 428 429 430 431 432 433
		/*
		 * There are more than 64k sections,
		 * read count from .sh_size.
		 */
		info->num_sections = TO_NATIVE(sechdrs[0].sh_size);
	}
	else {
		info->num_sections = hdr->e_shnum;
	}
	if (hdr->e_shstrndx == SHN_XINDEX) {
434
		info->secindex_strings = TO_NATIVE(sechdrs[0].sh_link);
435 436 437 438 439
	}
	else {
		info->secindex_strings = hdr->e_shstrndx;
	}

L
Linus Torvalds 已提交
440
	/* Fix endianness in section headers */
441
	for (i = 0; i < info->num_sections; i++) {
442 443 444 445 446 447 448 449 450 451
		sechdrs[i].sh_name      = TO_NATIVE(sechdrs[i].sh_name);
		sechdrs[i].sh_type      = TO_NATIVE(sechdrs[i].sh_type);
		sechdrs[i].sh_flags     = TO_NATIVE(sechdrs[i].sh_flags);
		sechdrs[i].sh_addr      = TO_NATIVE(sechdrs[i].sh_addr);
		sechdrs[i].sh_offset    = TO_NATIVE(sechdrs[i].sh_offset);
		sechdrs[i].sh_size      = TO_NATIVE(sechdrs[i].sh_size);
		sechdrs[i].sh_link      = TO_NATIVE(sechdrs[i].sh_link);
		sechdrs[i].sh_info      = TO_NATIVE(sechdrs[i].sh_info);
		sechdrs[i].sh_addralign = TO_NATIVE(sechdrs[i].sh_addralign);
		sechdrs[i].sh_entsize   = TO_NATIVE(sechdrs[i].sh_entsize);
L
Linus Torvalds 已提交
452 453
	}
	/* Find symbol table. */
454 455
	secstrings = (void *)hdr + sechdrs[info->secindex_strings].sh_offset;
	for (i = 1; i < info->num_sections; i++) {
456
		const char *secname;
457
		int nobits = sechdrs[i].sh_type == SHT_NOBITS;
L
Linus Torvalds 已提交
458

459
		if (!nobits && sechdrs[i].sh_offset > info->size) {
S
Sam Ravnborg 已提交
460 461 462 463
			fatal("%s is truncated. sechdrs[i].sh_offset=%lu > "
			      "sizeof(*hrd)=%zu\n", filename,
			      (unsigned long)sechdrs[i].sh_offset,
			      sizeof(*hdr));
464 465
			return 0;
		}
466 467
		secname = secstrings + sechdrs[i].sh_name;
		if (strcmp(secname, ".modinfo") == 0) {
468 469
			if (nobits)
				fatal("%s has NOBITS .modinfo\n", filename);
L
Linus Torvalds 已提交
470 471
			info->modinfo = (void *)hdr + sechdrs[i].sh_offset;
			info->modinfo_len = sechdrs[i].sh_size;
472 473
		} else if (strcmp(secname, "__ksymtab") == 0)
			info->export_sec = i;
474 475
		else if (strcmp(secname, "__ksymtab_unused") == 0)
			info->export_unused_sec = i;
476 477
		else if (strcmp(secname, "__ksymtab_gpl") == 0)
			info->export_gpl_sec = i;
478 479
		else if (strcmp(secname, "__ksymtab_unused_gpl") == 0)
			info->export_unused_gpl_sec = i;
480 481 482
		else if (strcmp(secname, "__ksymtab_gpl_future") == 0)
			info->export_gpl_future_sec = i;

483 484 485 486 487 488 489
		if (sechdrs[i].sh_type == SHT_SYMTAB) {
			unsigned int sh_link_idx;
			symtab_idx = i;
			info->symtab_start = (void *)hdr +
			    sechdrs[i].sh_offset;
			info->symtab_stop  = (void *)hdr +
			    sechdrs[i].sh_offset + sechdrs[i].sh_size;
490
			sh_link_idx = sechdrs[i].sh_link;
491 492 493
			info->strtab       = (void *)hdr +
			    sechdrs[sh_link_idx].sh_offset;
		}
L
Linus Torvalds 已提交
494

495 496 497 498 499 500 501 502
		/* 32bit section no. table? ("more than 64k sections") */
		if (sechdrs[i].sh_type == SHT_SYMTAB_SHNDX) {
			symtab_shndx_idx = i;
			info->symtab_shndx_start = (void *)hdr +
			    sechdrs[i].sh_offset;
			info->symtab_shndx_stop  = (void *)hdr +
			    sechdrs[i].sh_offset + sechdrs[i].sh_size;
		}
L
Linus Torvalds 已提交
503
	}
S
Sam Ravnborg 已提交
504
	if (!info->symtab_start)
505
		fatal("%s has no symtab?\n", filename);
S
Sam Ravnborg 已提交
506

L
Linus Torvalds 已提交
507 508 509 510 511 512 513
	/* Fix endianness in symbols */
	for (sym = info->symtab_start; sym < info->symtab_stop; sym++) {
		sym->st_shndx = TO_NATIVE(sym->st_shndx);
		sym->st_name  = TO_NATIVE(sym->st_name);
		sym->st_value = TO_NATIVE(sym->st_value);
		sym->st_size  = TO_NATIVE(sym->st_size);
	}
514 515 516

	if (symtab_shndx_idx != ~0U) {
		Elf32_Word *p;
517
		if (symtab_idx != sechdrs[symtab_shndx_idx].sh_link)
518
			fatal("%s: SYMTAB_SHNDX has bad sh_link: %u!=%u\n",
519
			      filename, sechdrs[symtab_shndx_idx].sh_link,
520 521 522 523 524 525 526
			      symtab_idx);
		/* Fix endianness */
		for (p = info->symtab_shndx_start; p < info->symtab_shndx_stop;
		     p++)
			*p = TO_NATIVE(*p);
	}

527
	return 1;
L
Linus Torvalds 已提交
528 529
}

530
static void parse_elf_finish(struct elf_info *info)
L
Linus Torvalds 已提交
531 532 533 534
{
	release_file(info->hdr, info->size);
}

535 536 537 538 539 540 541 542 543 544 545 546 547 548 549
static int ignore_undef_symbol(struct elf_info *info, const char *symname)
{
	/* ignore __this_module, it will be resolved shortly */
	if (strcmp(symname, MODULE_SYMBOL_PREFIX "__this_module") == 0)
		return 1;
	/* ignore global offset table */
	if (strcmp(symname, "_GLOBAL_OFFSET_TABLE_") == 0)
		return 1;
	if (info->hdr->e_machine == EM_PPC)
		/* Special register function linked on all modules during final link of .ko */
		if (strncmp(symname, "_restgpr_", sizeof("_restgpr_") - 1) == 0 ||
		    strncmp(symname, "_savegpr_", sizeof("_savegpr_") - 1) == 0 ||
		    strncmp(symname, "_rest32gpr_", sizeof("_rest32gpr_") - 1) == 0 ||
		    strncmp(symname, "_save32gpr_", sizeof("_save32gpr_") - 1) == 0)
			return 1;
550 551 552 553 554
	if (info->hdr->e_machine == EM_PPC64)
		/* Special register function linked on all modules during final link of .ko */
		if (strncmp(symname, "_restgpr0_", sizeof("_restgpr0_") - 1) == 0 ||
		    strncmp(symname, "_savegpr0_", sizeof("_savegpr0_") - 1) == 0)
			return 1;
555 556 557 558
	/* Do not ignore this symbol */
	return 0;
}

559 560
#define CRC_PFX     MODULE_SYMBOL_PREFIX "__crc_"
#define KSYMTAB_PFX MODULE_SYMBOL_PREFIX "__ksymtab_"
L
Linus Torvalds 已提交
561

562 563
static void handle_modversions(struct module *mod, struct elf_info *info,
			       Elf_Sym *sym, const char *symname)
L
Linus Torvalds 已提交
564 565
{
	unsigned int crc;
566
	enum export export = export_from_sec(info, get_secindex(info, sym));
L
Linus Torvalds 已提交
567 568 569

	switch (sym->st_shndx) {
	case SHN_COMMON:
570
		warn("\"%s\" [%s] is COMMON symbol\n", symname, mod->name);
L
Linus Torvalds 已提交
571 572 573
		break;
	case SHN_ABS:
		/* CRC'd symbol */
574
		if (strncmp(symname, CRC_PFX, strlen(CRC_PFX)) == 0) {
L
Linus Torvalds 已提交
575
			crc = (unsigned int) sym->st_value;
576 577
			sym_update_crc(symname + strlen(CRC_PFX), mod, crc,
					export);
L
Linus Torvalds 已提交
578 579 580 581 582 583 584
		}
		break;
	case SHN_UNDEF:
		/* undefined symbol */
		if (ELF_ST_BIND(sym->st_info) != STB_GLOBAL &&
		    ELF_ST_BIND(sym->st_info) != STB_WEAK)
			break;
585
		if (ignore_undef_symbol(info, symname))
L
Linus Torvalds 已提交
586
			break;
587 588 589 590 591 592
/* cope with newer glibc (2.3.4 or higher) STT_ definition in elf.h */
#if defined(STT_REGISTER) || defined(STT_SPARC_REGISTER)
/* add compatibility with older glibc */
#ifndef STT_SPARC_REGISTER
#define STT_SPARC_REGISTER STT_REGISTER
#endif
L
Linus Torvalds 已提交
593 594 595
		if (info->hdr->e_machine == EM_SPARC ||
		    info->hdr->e_machine == EM_SPARCV9) {
			/* Ignore register directives. */
596
			if (ELF_ST_TYPE(sym->st_info) == STT_SPARC_REGISTER)
L
Linus Torvalds 已提交
597
				break;
598 599 600 601 602 603
			if (symname[0] == '.') {
				char *munged = strdup(symname);
				munged[0] = '_';
				munged[1] = toupper(munged[1]);
				symname = munged;
			}
L
Linus Torvalds 已提交
604 605
		}
#endif
606

L
Linus Torvalds 已提交
607
		if (memcmp(symname, MODULE_SYMBOL_PREFIX,
S
Sam Ravnborg 已提交
608 609 610 611 612 613 614
			   strlen(MODULE_SYMBOL_PREFIX)) == 0) {
			mod->unres =
			  alloc_symbol(symname +
			               strlen(MODULE_SYMBOL_PREFIX),
			               ELF_ST_BIND(sym->st_info) == STB_WEAK,
			               mod->unres);
		}
L
Linus Torvalds 已提交
615 616 617
		break;
	default:
		/* All exported symbols */
618
		if (strncmp(symname, KSYMTAB_PFX, strlen(KSYMTAB_PFX)) == 0) {
619 620
			sym_add_exported(symname + strlen(KSYMTAB_PFX), mod,
					export);
L
Linus Torvalds 已提交
621 622 623 624 625 626 627 628 629
		}
		if (strcmp(symname, MODULE_SYMBOL_PREFIX "init_module") == 0)
			mod->has_init = 1;
		if (strcmp(symname, MODULE_SYMBOL_PREFIX "cleanup_module") == 0)
			mod->has_cleanup = 1;
		break;
	}
}

630 631 632
/**
 * Parse tag=value strings from .modinfo section
 **/
L
Linus Torvalds 已提交
633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650
static char *next_string(char *string, unsigned long *secsize)
{
	/* Skip non-zero chars */
	while (string[0]) {
		string++;
		if ((*secsize)-- <= 1)
			return NULL;
	}

	/* Skip any zero padding. */
	while (!string[0]) {
		string++;
		if ((*secsize)-- <= 1)
			return NULL;
	}
	return string;
}

651 652
static char *get_next_modinfo(void *modinfo, unsigned long modinfo_len,
			      const char *tag, char *info)
L
Linus Torvalds 已提交
653 654 655 656 657
{
	char *p;
	unsigned int taglen = strlen(tag);
	unsigned long size = modinfo_len;

658 659 660 661 662
	if (info) {
		size -= info - (char *)modinfo;
		modinfo = next_string(info, &size);
	}

L
Linus Torvalds 已提交
663 664 665 666 667 668 669
	for (p = modinfo; p; p = next_string(p, &size)) {
		if (strncmp(p, tag, taglen) == 0 && p[taglen] == '=')
			return p + taglen + 1;
	}
	return NULL;
}

670 671 672 673 674 675 676
static char *get_modinfo(void *modinfo, unsigned long modinfo_len,
			 const char *tag)

{
	return get_next_modinfo(modinfo, modinfo_len, tag, NULL);
}

677 678 679 680 681 682
/**
 * Test if string s ends in string sub
 * return 0 if match
 **/
static int strrcmp(const char *s, const char *sub)
{
S
Sam Ravnborg 已提交
683
	int slen, sublen;
684

685 686
	if (!s || !sub)
		return 1;
687

688
	slen = strlen(s);
S
Sam Ravnborg 已提交
689
	sublen = strlen(sub);
690

691 692 693
	if ((slen == 0) || (sublen == 0))
		return 1;

S
Sam Ravnborg 已提交
694 695
	if (sublen > slen)
		return 1;
696

S
Sam Ravnborg 已提交
697
	return memcmp(s + slen - sublen, sub, sublen);
698 699
}

700 701
static const char *sym_name(struct elf_info *elf, Elf_Sym *sym)
{
702 703 704
	if (sym)
		return elf->strtab + sym->st_name;
	else
705
		return "(unknown)";
706 707
}

708
static const char *sec_name(struct elf_info *elf, int secindex)
709 710 711
{
	Elf_Shdr *sechdrs = elf->sechdrs;
	return (void *)elf->hdr +
712 713
		elf->sechdrs[elf->secindex_strings].sh_offset +
		sechdrs[secindex].sh_name;
714 715 716 717 718
}

static const char *sech_name(struct elf_info *elf, Elf_Shdr *sechdr)
{
	return (void *)elf->hdr +
719 720
		elf->sechdrs[elf->secindex_strings].sh_offset +
		sechdr->sh_name;
721 722
}

723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742
/* if sym is empty or point to a string
 * like ".[0-9]+" then return 1.
 * This is the optional prefix added by ld to some sections
 */
static int number_prefix(const char *sym)
{
	if (*sym++ == '\0')
		return 1;
	if (*sym != '.')
		return 0;
	do {
		char c = *sym++;
		if (c < '0' || c > '9')
			return 0;
	} while (*sym);
	return 1;
}

/* The pattern is an array of simple patterns.
 * "foo" will match an exact string equal to "foo"
743
 * "*foo" will match a string that ends with "foo"
744 745 746 747 748 749
 * "foo*" will match a string that begins with "foo"
 * "foo$" will match a string equal to "foo" or "foo.1"
 *   where the '1' can be any number including several digits.
 *   The $ syntax is for sections where ld append a dot number
 *   to make section name unique.
 */
750
static int match(const char *sym, const char * const pat[])
751 752 753 754 755 756
{
	const char *p;
	while (*pat) {
		p = *pat++;
		const char *endp = p + strlen(p) - 1;

757 758 759 760 761
		/* "*foo" */
		if (*p == '*') {
			if (strrcmp(sym, p + 1) == 0)
				return 1;
		}
762
		/* "foo*" */
763
		else if (*endp == '*') {
764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785
			if (strncmp(sym, p, strlen(p) - 1) == 0)
				return 1;
		}
		/* "foo$" */
		else if (*endp == '$') {
			if (strncmp(sym, p, strlen(p) - 1) == 0) {
				if (number_prefix(sym + strlen(p) - 1))
					return 1;
			}
		}
		/* no wildcards */
		else {
			if (strcmp(p, sym) == 0)
				return 1;
		}
	}
	/* no match */
	return 0;
}

/* sections that we do not want to do full section mismatch check on */
static const char *section_white_list[] =
786 787 788
{
	".comment*",
	".debug*",
789
	".zdebug*",		/* Compressed debug sections. */
790
	".GCC-command-line",	/* mn10300 */
791 792 793 794 795 796 797 798
	".mdebug*",        /* alpha, score, mips etc. */
	".pdr",            /* alpha, score, mips etc. */
	".stab*",
	".note*",
	".got*",
	".toc*",
	NULL
};
799

800
/*
801
 * This is used to find sections missing the SHF_ALLOC flag.
802
 * The cause of this is often a section specified in assembler
803
 * without "ax" / "aw".
804
 */
805 806
static void check_section(const char *modname, struct elf_info *elf,
                          Elf_Shdr *sechdr)
807
{
808 809 810 811 812 813 814 815 816 817
	const char *sec = sech_name(elf, sechdr);

	if (sechdr->sh_type == SHT_PROGBITS &&
	    !(sechdr->sh_flags & SHF_ALLOC) &&
	    !match(sec, section_white_list)) {
		warn("%s (%s): unexpected non-allocatable section.\n"
		     "Did you forget to use \"ax\"/\"aw\" in a .S file?\n"
		     "Note that for example <linux/init.h> contains\n"
		     "section definitions for use in .S files.\n\n",
		     modname, sec);
818 819 820 821 822
	}
}



823
#define ALL_INIT_DATA_SECTIONS \
J
Jan Beulich 已提交
824 825
	".init.setup$", ".init.rodata$", \
	".devinit.rodata$", ".cpuinit.rodata$", ".meminit.rodata$" \
826 827 828
	".init.data$", ".devinit.data$", ".cpuinit.data$", ".meminit.data$"
#define ALL_EXIT_DATA_SECTIONS \
	".exit.data$", ".devexit.data$", ".cpuexit.data$", ".memexit.data$"
829

830 831 832 833
#define ALL_INIT_TEXT_SECTIONS \
	".init.text$", ".devinit.text$", ".cpuinit.text$", ".meminit.text$"
#define ALL_EXIT_TEXT_SECTIONS \
	".exit.text$", ".devexit.text$", ".cpuexit.text$", ".memexit.text$"
834

835 836 837 838 839 840 841
#define ALL_XXXINIT_SECTIONS DEV_INIT_SECTIONS, CPU_INIT_SECTIONS, \
	MEM_INIT_SECTIONS
#define ALL_XXXEXIT_SECTIONS DEV_EXIT_SECTIONS, CPU_EXIT_SECTIONS, \
	MEM_EXIT_SECTIONS

#define ALL_INIT_SECTIONS INIT_SECTIONS, ALL_XXXINIT_SECTIONS
#define ALL_EXIT_SECTIONS EXIT_SECTIONS, ALL_XXXEXIT_SECTIONS
842

843
#define DATA_SECTIONS ".data$", ".data.rel$"
844 845
#define TEXT_SECTIONS ".text$"

J
Jan Beulich 已提交
846 847 848 849
#define INIT_SECTIONS      ".init.*"
#define DEV_INIT_SECTIONS  ".devinit.*"
#define CPU_INIT_SECTIONS  ".cpuinit.*"
#define MEM_INIT_SECTIONS  ".meminit.*"
850

J
Jan Beulich 已提交
851 852 853 854
#define EXIT_SECTIONS      ".exit.*"
#define DEV_EXIT_SECTIONS  ".devexit.*"
#define CPU_EXIT_SECTIONS  ".cpuexit.*"
#define MEM_EXIT_SECTIONS  ".memexit.*"
855

856
/* init data sections */
857
static const char *init_data_sections[] = { ALL_INIT_DATA_SECTIONS, NULL };
858 859

/* all init sections */
860
static const char *init_sections[] = { ALL_INIT_SECTIONS, NULL };
861 862 863

/* All init and exit sections (code + data) */
static const char *init_exit_sections[] =
864
	{ALL_INIT_SECTIONS, ALL_EXIT_SECTIONS, NULL };
865 866 867 868 869 870

/* data section */
static const char *data_sections[] = { DATA_SECTIONS, NULL };


/* symbols in .data that may refer to init/exit sections */
871 872 873 874 875 876 877 878 879
#define DEFAULT_SYMBOL_WHITE_LIST					\
	"*driver",							\
	"*_template", /* scsi uses *_template a lot */			\
	"*_timer",    /* arm uses ops structures named _timer a lot */	\
	"*_sht",      /* scsi also used *_sht to some extent */		\
	"*_ops",							\
	"*_probe",							\
	"*_probe_one",							\
	"*_console"
880 881 882 883 884

static const char *head_sections[] = { ".head.text*", NULL };
static const char *linker_symbols[] =
	{ "__init_begin", "_sinittext", "_einittext", NULL };

885
enum mismatch {
886 887 888 889 890 891 892 893
	TEXT_TO_ANY_INIT,
	DATA_TO_ANY_INIT,
	TEXT_TO_ANY_EXIT,
	DATA_TO_ANY_EXIT,
	XXXINIT_TO_SOME_INIT,
	XXXEXIT_TO_SOME_EXIT,
	ANY_INIT_TO_ANY_EXIT,
	ANY_EXIT_TO_ANY_INIT,
894 895 896
	EXPORT_TO_INIT_EXIT,
};

897 898 899
struct sectioncheck {
	const char *fromsec[20];
	const char *tosec[20];
900
	enum mismatch mismatch;
901
	const char *symbol_white_list[20];
902 903 904 905 906 907 908
};

const struct sectioncheck sectioncheck[] = {
/* Do not reference init/exit code/data from
 * normal code and data
 */
{
909 910
	.fromsec = { TEXT_SECTIONS, NULL },
	.tosec   = { ALL_INIT_SECTIONS, NULL },
911
	.mismatch = TEXT_TO_ANY_INIT,
912
	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
913 914 915
},
{
	.fromsec = { DATA_SECTIONS, NULL },
916
	.tosec   = { ALL_XXXINIT_SECTIONS, NULL },
917
	.mismatch = DATA_TO_ANY_INIT,
918
	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
919
},
920 921 922 923 924 925 926 927 928
{
	.fromsec = { DATA_SECTIONS, NULL },
	.tosec   = { INIT_SECTIONS, NULL },
	.mismatch = DATA_TO_ANY_INIT,
	.symbol_white_list = {
		"*_template", "*_timer", "*_sht", "*_ops",
		"*_probe", "*_probe_one", "*_console", NULL
	},
},
929 930 931
{
	.fromsec = { TEXT_SECTIONS, NULL },
	.tosec   = { ALL_EXIT_SECTIONS, NULL },
932
	.mismatch = TEXT_TO_ANY_EXIT,
933
	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
934 935 936 937
},
{
	.fromsec = { DATA_SECTIONS, NULL },
	.tosec   = { ALL_EXIT_SECTIONS, NULL },
938
	.mismatch = DATA_TO_ANY_EXIT,
939
	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
940 941 942
},
/* Do not reference init code/data from devinit/cpuinit/meminit code/data */
{
943
	.fromsec = { ALL_XXXINIT_SECTIONS, NULL },
944
	.tosec   = { INIT_SECTIONS, NULL },
945
	.mismatch = XXXINIT_TO_SOME_INIT,
946
	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
947
},
J
Jan Beulich 已提交
948 949 950 951
/* Do not reference cpuinit code/data from meminit code/data */
{
	.fromsec = { MEM_INIT_SECTIONS, NULL },
	.tosec   = { CPU_INIT_SECTIONS, NULL },
952
	.mismatch = XXXINIT_TO_SOME_INIT,
953
	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
J
Jan Beulich 已提交
954 955 956 957 958
},
/* Do not reference meminit code/data from cpuinit code/data */
{
	.fromsec = { CPU_INIT_SECTIONS, NULL },
	.tosec   = { MEM_INIT_SECTIONS, NULL },
959
	.mismatch = XXXINIT_TO_SOME_INIT,
960
	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
J
Jan Beulich 已提交
961
},
962 963
/* Do not reference exit code/data from devexit/cpuexit/memexit code/data */
{
964
	.fromsec = { ALL_XXXEXIT_SECTIONS, NULL },
965
	.tosec   = { EXIT_SECTIONS, NULL },
966
	.mismatch = XXXEXIT_TO_SOME_EXIT,
967
	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
968
},
J
Jan Beulich 已提交
969 970 971 972
/* Do not reference cpuexit code/data from memexit code/data */
{
	.fromsec = { MEM_EXIT_SECTIONS, NULL },
	.tosec   = { CPU_EXIT_SECTIONS, NULL },
973
	.mismatch = XXXEXIT_TO_SOME_EXIT,
974
	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
J
Jan Beulich 已提交
975 976 977 978 979
},
/* Do not reference memexit code/data from cpuexit code/data */
{
	.fromsec = { CPU_EXIT_SECTIONS, NULL },
	.tosec   = { MEM_EXIT_SECTIONS, NULL },
980
	.mismatch = XXXEXIT_TO_SOME_EXIT,
981
	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
J
Jan Beulich 已提交
982
},
983 984
/* Do not use exit code/data from init code */
{
985 986
	.fromsec = { ALL_INIT_SECTIONS, NULL },
	.tosec   = { ALL_EXIT_SECTIONS, NULL },
987
	.mismatch = ANY_INIT_TO_ANY_EXIT,
988
	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
989 990 991
},
/* Do not use init code/data from exit code */
{
992
	.fromsec = { ALL_EXIT_SECTIONS, NULL },
993
	.tosec   = { ALL_INIT_SECTIONS, NULL },
994
	.mismatch = ANY_EXIT_TO_ANY_INIT,
995
	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
996 997 998 999
},
/* Do not export init/exit functions or data */
{
	.fromsec = { "__ksymtab*", NULL },
1000
	.tosec   = { INIT_SECTIONS, EXIT_SECTIONS, NULL },
1001 1002
	.mismatch = EXPORT_TO_INIT_EXIT,
	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1003 1004 1005
}
};

1006 1007
static const struct sectioncheck *section_mismatch(
		const char *fromsec, const char *tosec)
1008 1009 1010 1011 1012 1013 1014 1015
{
	int i;
	int elems = sizeof(sectioncheck) / sizeof(struct sectioncheck);
	const struct sectioncheck *check = &sectioncheck[0];

	for (i = 0; i < elems; i++) {
		if (match(fromsec, check->fromsec) &&
		    match(tosec, check->tosec))
1016
			return check;
1017 1018
		check++;
	}
1019
	return NULL;
1020 1021
}

1022 1023
/**
 * Whitelist to allow certain references to pass with no warning.
1024
 *
1025 1026 1027 1028 1029 1030 1031
 * Pattern 1:
 *   If a module parameter is declared __initdata and permissions=0
 *   then this is legal despite the warning generated.
 *   We cannot see value of permissions here, so just ignore
 *   this pattern.
 *   The pattern is identified by:
 *   tosec   = .init.data
1032
 *   fromsec = .data*
1033
 *   atsym   =__param*
1034
 *
1035 1036 1037 1038 1039 1040 1041
 * Pattern 1a:
 *   module_param_call() ops can refer to __init set function if permissions=0
 *   The pattern is identified by:
 *   tosec   = .init.text
 *   fromsec = .data*
 *   atsym   = __param_ops_*
 *
1042
 * Pattern 2:
1043
 *   Many drivers utilise a *driver container with references to
1044
 *   add, remove, probe functions etc.
1045
 *   These functions may often be marked __devinit and we do not want to
1046 1047
 *   warn here.
 *   the pattern is identified by:
1048 1049
 *   tosec   = init or exit section
 *   fromsec = data section
S
Sam Ravnborg 已提交
1050 1051
 *   atsym = *driver, *_template, *_sht, *_ops, *_probe,
 *           *probe_one, *_console, *_timer
1052 1053
 *
 * Pattern 3:
S
Sam Ravnborg 已提交
1054
 *   Whitelist all references from .head.text to any init section
1055
 *
1056
 * Pattern 4:
1057 1058 1059 1060 1061 1062 1063
 *   Some symbols belong to init section but still it is ok to reference
 *   these from non-init sections as these symbols don't have any memory
 *   allocated for them and symbol address and value are same. So even
 *   if init section is freed, its ok to reference those symbols.
 *   For ex. symbols marking the init section boundaries.
 *   This pattern is identified by
 *   refsymname = __init_begin, _sinittext, _einittext
1064
 *
1065
 **/
1066 1067
static int secref_whitelist(const struct sectioncheck *mismatch,
			    const char *fromsec, const char *fromsym,
1068
			    const char *tosec, const char *tosym)
1069 1070
{
	/* Check for pattern 1 */
1071 1072
	if (match(tosec, init_data_sections) &&
	    match(fromsec, data_sections) &&
1073 1074
	    (strncmp(fromsym, "__param", strlen("__param")) == 0))
		return 0;
1075

1076 1077 1078 1079 1080 1081
	/* Check for pattern 1a */
	if (strcmp(tosec, ".init.text") == 0 &&
	    match(fromsec, data_sections) &&
	    (strncmp(fromsym, "__param_ops_", strlen("__param_ops_")) == 0))
		return 0;

1082
	/* Check for pattern 2 */
1083 1084
	if (match(tosec, init_exit_sections) &&
	    match(fromsec, data_sections) &&
1085
	    match(fromsym, mismatch->symbol_white_list))
1086
		return 0;
1087

1088
	/* Check for pattern 3 */
1089 1090
	if (match(fromsec, head_sections) &&
	    match(tosec, init_sections))
1091
		return 0;
1092

1093
	/* Check for pattern 4 */
1094 1095
	if (match(tosym, linker_symbols))
		return 0;
1096

1097
	return 1;
1098 1099
}

1100 1101 1102 1103 1104 1105 1106
/**
 * Find symbol based on relocation record info.
 * In some cases the symbol supplied is a valid symbol so
 * return refsym. If st_name != 0 we assume this is a valid symbol.
 * In other cases the symbol needs to be looked up in the symbol table
 * based on section and address.
 *  **/
1107
static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr,
1108 1109 1110
				Elf_Sym *relsym)
{
	Elf_Sym *sym;
1111 1112 1113
	Elf_Sym *near = NULL;
	Elf64_Sword distance = 20;
	Elf64_Sword d;
1114
	unsigned int relsym_secindex;
1115 1116 1117

	if (relsym->st_name != 0)
		return relsym;
1118 1119

	relsym_secindex = get_secindex(elf, relsym);
1120
	for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
1121
		if (get_secindex(elf, sym) != relsym_secindex)
1122
			continue;
1123 1124
		if (ELF_ST_TYPE(sym->st_info) == STT_SECTION)
			continue;
1125 1126
		if (sym->st_value == addr)
			return sym;
1127 1128 1129 1130 1131 1132 1133 1134
		/* Find a symbol nearby - addr are maybe negative */
		d = sym->st_value - addr;
		if (d < 0)
			d = addr - sym->st_value;
		if (d < distance) {
			distance = d;
			near = sym;
		}
1135
	}
1136 1137 1138 1139 1140
	/* We need a close match */
	if (distance < 20)
		return near;
	else
		return NULL;
1141 1142
}

1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166
static inline int is_arm_mapping_symbol(const char *str)
{
	return str[0] == '$' && strchr("atd", str[1])
	       && (str[2] == '\0' || str[2] == '.');
}

/*
 * If there's no name there, ignore it; likewise, ignore it if it's
 * one of the magic symbols emitted used by current ARM tools.
 *
 * Otherwise if find_symbols_between() returns those symbols, they'll
 * fail the whitelist tests and cause lots of false alarms ... fixable
 * only by merging __exit and __init sections into __text, bloating
 * the kernel (which is especially evil on embedded platforms).
 */
static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym)
{
	const char *name = elf->strtab + sym->st_name;

	if (!name || !strlen(name))
		return 0;
	return !is_arm_mapping_symbol(name);
}

1167
/*
1168 1169 1170 1171
 * Find symbols before or equal addr and after addr - in the section sec.
 * If we find two symbols with equal offset prefer one with a valid name.
 * The ELF format may have a better way to detect what type of symbol
 * it is, but this works for now.
1172
 **/
1173 1174
static Elf_Sym *find_elf_symbol2(struct elf_info *elf, Elf_Addr addr,
				 const char *sec)
1175 1176
{
	Elf_Sym *sym;
1177 1178
	Elf_Sym *near = NULL;
	Elf_Addr distance = ~0;
1179

1180 1181 1182
	for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
		const char *symsec;

1183
		if (is_shndx_special(sym->st_shndx))
1184
			continue;
1185
		symsec = sec_name(elf, get_secindex(elf, sym));
1186 1187
		if (strcmp(symsec, sec) != 0)
			continue;
1188 1189
		if (!is_valid_name(elf, sym))
			continue;
1190
		if (sym->st_value <= addr) {
1191 1192 1193 1194 1195
			if ((addr - sym->st_value) < distance) {
				distance = addr - sym->st_value;
				near = sym;
			} else if ((addr - sym->st_value) == distance) {
				near = sym;
1196
			}
1197 1198
		}
	}
1199
	return near;
1200 1201
}

1202 1203 1204 1205 1206 1207
/*
 * Convert a section name to the function/data attribute
 * .init.text => __init
 * .cpuinit.data => __cpudata
 * .memexitconst => __memconst
 * etc.
1208 1209 1210
 *
 * The memory of returned value has been allocated on a heap. The user of this
 * method should free it after usage.
1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232
*/
static char *sec2annotation(const char *s)
{
	if (match(s, init_exit_sections)) {
		char *p = malloc(20);
		char *r = p;

		*p++ = '_';
		*p++ = '_';
		if (*s == '.')
			s++;
		while (*s && *s != '.')
			*p++ = *s++;
		*p = '\0';
		if (*s == '.')
			s++;
		if (strstr(s, "rodata") != NULL)
			strcat(p, "const ");
		else if (strstr(s, "data") != NULL)
			strcat(p, "data ");
		else
			strcat(p, " ");
1233
		return r;
1234
	} else {
1235
		return strdup("");
1236 1237 1238 1239 1240 1241 1242 1243
	}
}

static int is_function(Elf_Sym *sym)
{
	if (sym)
		return ELF_ST_TYPE(sym->st_info) == STT_FUNC;
	else
1244
		return -1;
1245 1246
}

R
Randy Dunlap 已提交
1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259
static void print_section_list(const char * const list[20])
{
	const char *const *s = list;

	while (*s) {
		fprintf(stderr, "%s", *s);
		s++;
		if (*s)
			fprintf(stderr, ", ");
	}
	fprintf(stderr, "\n");
}

1260
/*
1261 1262
 * Print a warning about a section mismatch.
 * Try to find symbols near it so user can find it.
1263
 * Check whitelist before warning - it may be a false positive.
1264
 */
1265 1266
static void report_sec_mismatch(const char *modname,
				const struct sectioncheck *mismatch,
1267 1268 1269
                                const char *fromsec,
                                unsigned long long fromaddr,
                                const char *fromsym,
1270 1271 1272 1273 1274 1275
                                int from_is_func,
                                const char *tosec, const char *tosym,
                                int to_is_func)
{
	const char *from, *from_p;
	const char *to, *to_p;
1276 1277
	char *prl_from;
	char *prl_to;
1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288

	switch (from_is_func) {
	case 0: from = "variable"; from_p = "";   break;
	case 1: from = "function"; from_p = "()"; break;
	default: from = "(unknown reference)"; from_p = ""; break;
	}
	switch (to_is_func) {
	case 0: to = "variable"; to_p = "";   break;
	case 1: to = "function"; to_p = "()"; break;
	default: to = "(unknown reference)"; to_p = ""; break;
	}
1289

1290 1291 1292 1293
	sec_mismatch_count++;
	if (!sec_mismatch_verbose)
		return;

1294 1295 1296 1297
	warn("%s(%s+0x%llx): Section mismatch in reference from the %s %s%s "
	     "to the %s %s:%s%s\n",
	     modname, fromsec, fromaddr, from, fromsym, from_p, to, tosec,
	     tosym, to_p);
1298

1299
	switch (mismatch->mismatch) {
1300
	case TEXT_TO_ANY_INIT:
1301 1302
		prl_from = sec2annotation(fromsec);
		prl_to = sec2annotation(tosec);
1303
		fprintf(stderr,
1304
		"The function %s%s() references\n"
1305 1306 1307
		"the %s %s%s%s.\n"
		"This is often because %s lacks a %s\n"
		"annotation or the annotation of %s is wrong.\n",
1308 1309 1310 1311 1312
		prl_from, fromsym,
		to, prl_to, tosym, to_p,
		fromsym, prl_to, tosym);
		free(prl_from);
		free(prl_to);
1313
		break;
1314
	case DATA_TO_ANY_INIT: {
1315
		prl_to = sec2annotation(tosec);
1316 1317 1318 1319
		fprintf(stderr,
		"The variable %s references\n"
		"the %s %s%s%s\n"
		"If the reference is valid then annotate the\n"
1320
		"variable with __init* or __refdata (see linux/init.h) "
1321
		"or name the variable:\n",
1322
		fromsym, to, prl_to, tosym, to_p);
R
Randy Dunlap 已提交
1323
		print_section_list(mismatch->symbol_white_list);
1324
		free(prl_to);
1325
		break;
1326
	}
1327
	case TEXT_TO_ANY_EXIT:
1328
		prl_to = sec2annotation(tosec);
1329 1330 1331 1332
		fprintf(stderr,
		"The function %s() references a %s in an exit section.\n"
		"Often the %s %s%s has valid usage outside the exit section\n"
		"and the fix is to remove the %sannotation of %s.\n",
1333 1334
		fromsym, to, to, tosym, to_p, prl_to, tosym);
		free(prl_to);
1335
		break;
1336
	case DATA_TO_ANY_EXIT: {
1337
		prl_to = sec2annotation(tosec);
1338 1339 1340 1341 1342 1343
		fprintf(stderr,
		"The variable %s references\n"
		"the %s %s%s%s\n"
		"If the reference is valid then annotate the\n"
		"variable with __exit* (see linux/init.h) or "
		"name the variable:\n",
1344
		fromsym, to, prl_to, tosym, to_p);
R
Randy Dunlap 已提交
1345
		print_section_list(mismatch->symbol_white_list);
1346
		free(prl_to);
1347 1348
		break;
	}
1349 1350
	case XXXINIT_TO_SOME_INIT:
	case XXXEXIT_TO_SOME_EXIT:
1351 1352
		prl_from = sec2annotation(fromsec);
		prl_to = sec2annotation(tosec);
1353 1354 1355 1356 1357
		fprintf(stderr,
		"The %s %s%s%s references\n"
		"a %s %s%s%s.\n"
		"If %s is only used by %s then\n"
		"annotate %s with a matching annotation.\n",
1358 1359
		from, prl_from, fromsym, from_p,
		to, prl_to, tosym, to_p,
1360
		tosym, fromsym, tosym);
1361 1362
		free(prl_from);
		free(prl_to);
1363
		break;
1364
	case ANY_INIT_TO_ANY_EXIT:
1365 1366
		prl_from = sec2annotation(fromsec);
		prl_to = sec2annotation(tosec);
1367 1368 1369 1370 1371 1372 1373 1374
		fprintf(stderr,
		"The %s %s%s%s references\n"
		"a %s %s%s%s.\n"
		"This is often seen when error handling "
		"in the init function\n"
		"uses functionality in the exit path.\n"
		"The fix is often to remove the %sannotation of\n"
		"%s%s so it may be used outside an exit section.\n",
1375 1376
		from, prl_from, fromsym, from_p,
		to, prl_to, tosym, to_p,
1377
		prl_to, tosym, to_p);
1378 1379
		free(prl_from);
		free(prl_to);
1380
		break;
1381
	case ANY_EXIT_TO_ANY_INIT:
1382 1383
		prl_from = sec2annotation(fromsec);
		prl_to = sec2annotation(tosec);
1384 1385 1386 1387 1388 1389 1390 1391
		fprintf(stderr,
		"The %s %s%s%s references\n"
		"a %s %s%s%s.\n"
		"This is often seen when error handling "
		"in the exit function\n"
		"uses functionality in the init path.\n"
		"The fix is often to remove the %sannotation of\n"
		"%s%s so it may be used outside an init section.\n",
1392 1393 1394 1395 1396
		from, prl_from, fromsym, from_p,
		to, prl_to, tosym, to_p,
		prl_to, tosym, to_p);
		free(prl_from);
		free(prl_to);
1397 1398
		break;
	case EXPORT_TO_INIT_EXIT:
1399
		prl_to = sec2annotation(tosec);
1400 1401 1402 1403
		fprintf(stderr,
		"The symbol %s is exported and annotated %s\n"
		"Fix this by removing the %sannotation of %s "
		"or drop the export.\n",
1404 1405
		tosym, prl_to, prl_to, tosym);
		free(prl_to);
1406 1407 1408
		break;
	}
	fprintf(stderr, "\n");
1409 1410 1411 1412 1413 1414
}

static void check_section_mismatch(const char *modname, struct elf_info *elf,
                                   Elf_Rela *r, Elf_Sym *sym, const char *fromsec)
{
	const char *tosec;
1415
	const struct sectioncheck *mismatch;
1416

1417
	tosec = sec_name(elf, get_secindex(elf, sym));
1418
	mismatch = section_mismatch(fromsec, tosec);
1419
	if (mismatch) {
1420 1421
		Elf_Sym *to;
		Elf_Sym *from;
1422
		const char *tosym;
1423
		const char *fromsym;
1424

1425 1426 1427 1428
		from = find_elf_symbol2(elf, r->r_offset, fromsec);
		fromsym = sym_name(elf, from);
		to = find_elf_symbol(elf, r->r_addend, sym);
		tosym = sym_name(elf, to);
1429 1430

		/* check whitelist - we may ignore it */
1431 1432
		if (secref_whitelist(mismatch,
					fromsec, fromsym, tosec, tosym)) {
1433 1434 1435 1436
			report_sec_mismatch(modname, mismatch,
			   fromsec, r->r_offset, fromsym,
			   is_function(from), tosec, tosym,
			   is_function(to));
1437
		}
1438 1439 1440
	}
}

1441
static unsigned int *reloc_location(struct elf_info *elf,
1442
				    Elf_Shdr *sechdr, Elf_Rela *r)
1443 1444
{
	Elf_Shdr *sechdrs = elf->sechdrs;
1445
	int section = sechdr->sh_info;
1446 1447

	return (void *)elf->hdr + sechdrs[section].sh_offset +
1448
		r->r_offset;
1449 1450
}

1451
static int addend_386_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1452 1453
{
	unsigned int r_typ = ELF_R_TYPE(r->r_info);
1454
	unsigned int *location = reloc_location(elf, sechdr, r);
1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469

	switch (r_typ) {
	case R_386_32:
		r->r_addend = TO_NATIVE(*location);
		break;
	case R_386_PC32:
		r->r_addend = TO_NATIVE(*location) + 4;
		/* For CONFIG_RELOCATABLE=y */
		if (elf->hdr->e_type == ET_EXEC)
			r->r_addend += r->r_offset;
		break;
	}
	return 0;
}

1470
static int addend_arm_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1471 1472 1473 1474 1475 1476
{
	unsigned int r_typ = ELF_R_TYPE(r->r_info);

	switch (r_typ) {
	case R_ARM_ABS32:
		/* From ARM ABI: (S + A) | T */
S
Sam Ravnborg 已提交
1477 1478
		r->r_addend = (int)(long)
		              (elf->symtab_start + ELF_R_SYM(r->r_info));
1479 1480 1481
		break;
	case R_ARM_PC24:
		/* From ARM ABI: ((S + A) | T) - P */
S
Sam Ravnborg 已提交
1482
		r->r_addend = (int)(long)(elf->hdr +
1483 1484
		              sechdr->sh_offset +
		              (r->r_offset - sechdr->sh_addr));
1485 1486 1487 1488 1489 1490 1491
		break;
	default:
		return 1;
	}
	return 0;
}

1492
static int addend_mips_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1493 1494
{
	unsigned int r_typ = ELF_R_TYPE(r->r_info);
1495
	unsigned int *location = reloc_location(elf, sechdr, r);
1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514
	unsigned int inst;

	if (r_typ == R_MIPS_HI16)
		return 1;	/* skip this */
	inst = TO_NATIVE(*location);
	switch (r_typ) {
	case R_MIPS_LO16:
		r->r_addend = inst & 0xffff;
		break;
	case R_MIPS_26:
		r->r_addend = (inst & 0x03ffffff) << 2;
		break;
	case R_MIPS_32:
		r->r_addend = inst;
		break;
	}
	return 0;
}

1515
static void section_rela(const char *modname, struct elf_info *elf,
1516
                         Elf_Shdr *sechdr)
1517 1518 1519 1520 1521 1522 1523
{
	Elf_Sym  *sym;
	Elf_Rela *rela;
	Elf_Rela r;
	unsigned int r_sym;
	const char *fromsec;

1524
	Elf_Rela *start = (void *)elf->hdr + sechdr->sh_offset;
1525 1526
	Elf_Rela *stop  = (void *)start + sechdr->sh_size;

1527
	fromsec = sech_name(elf, sechdr);
1528 1529
	fromsec += strlen(".rela");
	/* if from section (name) is know good then skip it */
1530
	if (match(fromsec, section_white_list))
1531
		return;
1532

1533 1534 1535
	for (rela = start; rela < stop; rela++) {
		r.r_offset = TO_NATIVE(rela->r_offset);
#if KERNEL_ELFCLASS == ELFCLASS64
1536
		if (elf->hdr->e_machine == EM_MIPS) {
1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552
			unsigned int r_typ;
			r_sym = ELF64_MIPS_R_SYM(rela->r_info);
			r_sym = TO_NATIVE(r_sym);
			r_typ = ELF64_MIPS_R_TYPE(rela->r_info);
			r.r_info = ELF64_R_INFO(r_sym, r_typ);
		} else {
			r.r_info = TO_NATIVE(rela->r_info);
			r_sym = ELF_R_SYM(r.r_info);
		}
#else
		r.r_info = TO_NATIVE(rela->r_info);
		r_sym = ELF_R_SYM(r.r_info);
#endif
		r.r_addend = TO_NATIVE(rela->r_addend);
		sym = elf->symtab_start + r_sym;
		/* Skip special sections */
1553
		if (is_shndx_special(sym->st_shndx))
1554
			continue;
1555
		check_section_mismatch(modname, elf, &r, sym, fromsec);
1556 1557 1558 1559
	}
}

static void section_rel(const char *modname, struct elf_info *elf,
1560
                        Elf_Shdr *sechdr)
1561 1562 1563 1564 1565 1566 1567
{
	Elf_Sym *sym;
	Elf_Rel *rel;
	Elf_Rela r;
	unsigned int r_sym;
	const char *fromsec;

1568
	Elf_Rel *start = (void *)elf->hdr + sechdr->sh_offset;
1569 1570
	Elf_Rel *stop  = (void *)start + sechdr->sh_size;

1571
	fromsec = sech_name(elf, sechdr);
1572 1573
	fromsec += strlen(".rel");
	/* if from section (name) is know good then skip it */
1574
	if (match(fromsec, section_white_list))
1575 1576 1577 1578 1579
		return;

	for (rel = start; rel < stop; rel++) {
		r.r_offset = TO_NATIVE(rel->r_offset);
#if KERNEL_ELFCLASS == ELFCLASS64
1580
		if (elf->hdr->e_machine == EM_MIPS) {
1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594
			unsigned int r_typ;
			r_sym = ELF64_MIPS_R_SYM(rel->r_info);
			r_sym = TO_NATIVE(r_sym);
			r_typ = ELF64_MIPS_R_TYPE(rel->r_info);
			r.r_info = ELF64_R_INFO(r_sym, r_typ);
		} else {
			r.r_info = TO_NATIVE(rel->r_info);
			r_sym = ELF_R_SYM(r.r_info);
		}
#else
		r.r_info = TO_NATIVE(rel->r_info);
		r_sym = ELF_R_SYM(r.r_info);
#endif
		r.r_addend = 0;
1595
		switch (elf->hdr->e_machine) {
1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610
		case EM_386:
			if (addend_386_rel(elf, sechdr, &r))
				continue;
			break;
		case EM_ARM:
			if (addend_arm_rel(elf, sechdr, &r))
				continue;
			break;
		case EM_MIPS:
			if (addend_mips_rel(elf, sechdr, &r))
				continue;
			break;
		}
		sym = elf->symtab_start + r_sym;
		/* Skip special sections */
1611
		if (is_shndx_special(sym->st_shndx))
1612
			continue;
1613
		check_section_mismatch(modname, elf, &r, sym, fromsec);
1614 1615 1616
	}
}

1617 1618 1619 1620
/**
 * A module includes a number of sections that are discarded
 * either when loaded or when used as built-in.
 * For loaded modules all functions marked __init and all data
1621
 * marked __initdata will be discarded when the module has been initialized.
1622 1623
 * Likewise for modules used built-in the sections marked __exit
 * are discarded because __exit marked function are supposed to be called
1624
 * only when a module is unloaded which never happens for built-in modules.
1625 1626 1627 1628 1629
 * The check_sec_ref() function traverses all relocation records
 * to find all references to a section that reference a section that will
 * be discarded and warns about it.
 **/
static void check_sec_ref(struct module *mod, const char *modname,
1630
                          struct elf_info *elf)
1631 1632 1633
{
	int i;
	Elf_Shdr *sechdrs = elf->sechdrs;
1634

1635
	/* Walk through all sections */
1636
	for (i = 0; i < elf->num_sections; i++) {
1637
		check_section(modname, elf, &elf->sechdrs[i]);
1638
		/* We want to process only relocation sections and not .init */
1639
		if (sechdrs[i].sh_type == SHT_RELA)
1640
			section_rela(modname, elf, &elf->sechdrs[i]);
1641
		else if (sechdrs[i].sh_type == SHT_REL)
1642
			section_rel(modname, elf, &elf->sechdrs[i]);
1643 1644 1645
	}
}

1646
static void read_symbols(char *modname)
L
Linus Torvalds 已提交
1647 1648 1649
{
	const char *symname;
	char *version;
1650
	char *license;
L
Linus Torvalds 已提交
1651 1652 1653 1654
	struct module *mod;
	struct elf_info info = { };
	Elf_Sym *sym;

1655 1656
	if (!parse_elf(&info, modname))
		return;
L
Linus Torvalds 已提交
1657 1658 1659 1660 1661 1662 1663 1664 1665 1666

	mod = new_module(modname);

	/* When there's no vmlinux, don't print warnings about
	 * unresolved symbols (since there'll be too many ;) */
	if (is_vmlinux(modname)) {
		have_vmlinux = 1;
		mod->skip = 1;
	}

1667
	license = get_modinfo(info.modinfo, info.modinfo_len, "license");
1668 1669 1670 1671
	if (info.modinfo && !license && !is_vmlinux(modname))
		warn("modpost: missing MODULE_LICENSE() in %s\n"
		     "see include/linux/module.h for "
		     "more information\n", modname);
1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682
	while (license) {
		if (license_is_gpl_compatible(license))
			mod->gpl_compatible = 1;
		else {
			mod->gpl_compatible = 0;
			break;
		}
		license = get_next_modinfo(info.modinfo, info.modinfo_len,
					   "license", license);
	}

L
Linus Torvalds 已提交
1683 1684 1685 1686 1687 1688
	for (sym = info.symtab_start; sym < info.symtab_stop; sym++) {
		symname = info.strtab + sym->st_name;

		handle_modversions(mod, &info, sym, symname);
		handle_moddevtable(mod, &info, sym, symname);
	}
1689
	if (!is_vmlinux(modname) ||
1690 1691
	     (is_vmlinux(modname) && vmlinux_section_warnings))
		check_sec_ref(mod, modname, &info);
L
Linus Torvalds 已提交
1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702

	version = get_modinfo(info.modinfo, info.modinfo_len, "version");
	if (version)
		maybe_frob_rcs_version(modname, version, info.modinfo,
				       version - (char *)info.hdr);
	if (version || (all_versions && !is_vmlinux(modname)))
		get_src_version(modname, mod->srcversion,
				sizeof(mod->srcversion)-1);

	parse_elf_finish(&info);

1703
	/* Our trick to get versioning for module struct etc. - it's
L
Linus Torvalds 已提交
1704 1705 1706 1707
	 * never passed as an argument to an exported function, so
	 * the automatic versioning doesn't pick it up, but it's really
	 * important anyhow */
	if (modversions)
1708
		mod->unres = alloc_symbol("module_layout", 0, mod->unres);
L
Linus Torvalds 已提交
1709 1710 1711 1712 1713 1714 1715 1716
}

#define SZ 500

/* We first write the generated file into memory using the
 * following helper, then compare to the file on disk and
 * only update the later if anything changed */

1717 1718
void __attribute__((format(printf, 2, 3))) buf_printf(struct buffer *buf,
						      const char *fmt, ...)
L
Linus Torvalds 已提交
1719 1720 1721 1722
{
	char tmp[SZ];
	int len;
	va_list ap;
1723

L
Linus Torvalds 已提交
1724 1725
	va_start(ap, fmt);
	len = vsnprintf(tmp, SZ, fmt, ap);
1726
	buf_write(buf, tmp, len);
L
Linus Torvalds 已提交
1727 1728 1729
	va_end(ap);
}

1730
void buf_write(struct buffer *buf, const char *s, int len)
L
Linus Torvalds 已提交
1731 1732
{
	if (buf->size - buf->pos < len) {
1733
		buf->size += len + SZ;
L
Linus Torvalds 已提交
1734 1735 1736 1737 1738 1739
		buf->p = realloc(buf->p, buf->size);
	}
	strncpy(buf->p + buf->pos, s, len);
	buf->pos += len;
}

1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764
static void check_for_gpl_usage(enum export exp, const char *m, const char *s)
{
	const char *e = is_vmlinux(m) ?"":".ko";

	switch (exp) {
	case export_gpl:
		fatal("modpost: GPL-incompatible module %s%s "
		      "uses GPL-only symbol '%s'\n", m, e, s);
		break;
	case export_unused_gpl:
		fatal("modpost: GPL-incompatible module %s%s "
		      "uses GPL-only symbol marked UNUSED '%s'\n", m, e, s);
		break;
	case export_gpl_future:
		warn("modpost: GPL-incompatible module %s%s "
		      "uses future GPL-only symbol '%s'\n", m, e, s);
		break;
	case export_plain:
	case export_unused:
	case export_unknown:
		/* ignore */
		break;
	}
}

S
Sam Ravnborg 已提交
1765
static void check_for_unused(enum export exp, const char *m, const char *s)
1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781
{
	const char *e = is_vmlinux(m) ?"":".ko";

	switch (exp) {
	case export_unused:
	case export_unused_gpl:
		warn("modpost: module %s%s "
		      "uses symbol '%s' marked UNUSED\n", m, e, s);
		break;
	default:
		/* ignore */
		break;
	}
}

static void check_exports(struct module *mod)
1782 1783 1784 1785
{
	struct symbol *s, *exp;

	for (s = mod->unres; s; s = s->next) {
A
Andrew Morton 已提交
1786
		const char *basename;
1787 1788 1789
		exp = find_symbol(s->name);
		if (!exp || exp->module == mod)
			continue;
A
Andrew Morton 已提交
1790
		basename = strrchr(mod->name, '/');
1791 1792
		if (basename)
			basename++;
1793 1794 1795 1796 1797
		else
			basename = mod->name;
		if (!mod->gpl_compatible)
			check_for_gpl_usage(exp->export, basename, exp->name);
		check_for_unused(exp->export, basename, exp->name);
S
Sam Ravnborg 已提交
1798
	}
1799 1800
}

1801 1802 1803 1804
/**
 * Header for the generated file
 **/
static void add_header(struct buffer *b, struct module *mod)
L
Linus Torvalds 已提交
1805 1806 1807 1808 1809 1810 1811 1812 1813
{
	buf_printf(b, "#include <linux/module.h>\n");
	buf_printf(b, "#include <linux/vermagic.h>\n");
	buf_printf(b, "#include <linux/compiler.h>\n");
	buf_printf(b, "\n");
	buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n");
	buf_printf(b, "\n");
	buf_printf(b, "struct module __this_module\n");
	buf_printf(b, "__attribute__((section(\".gnu.linkonce.this_module\"))) = {\n");
1814
	buf_printf(b, " .name = KBUILD_MODNAME,\n");
L
Linus Torvalds 已提交
1815 1816 1817 1818 1819 1820
	if (mod->has_init)
		buf_printf(b, " .init = init_module,\n");
	if (mod->has_cleanup)
		buf_printf(b, "#ifdef CONFIG_MODULE_UNLOAD\n"
			      " .exit = cleanup_module,\n"
			      "#endif\n");
1821
	buf_printf(b, " .arch = MODULE_ARCH_INIT,\n");
L
Linus Torvalds 已提交
1822 1823 1824
	buf_printf(b, "};\n");
}

1825
static void add_staging_flag(struct buffer *b, const char *name)
1826 1827 1828 1829 1830 1831 1832
{
	static const char *staging_dir = "drivers/staging";

	if (strncmp(staging_dir, name, strlen(staging_dir)) == 0)
		buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n");
}

1833 1834 1835
/**
 * Record CRCs for unresolved symbols
 **/
1836
static int add_versions(struct buffer *b, struct module *mod)
L
Linus Torvalds 已提交
1837 1838
{
	struct symbol *s, *exp;
1839
	int err = 0;
L
Linus Torvalds 已提交
1840 1841 1842 1843

	for (s = mod->unres; s; s = s->next) {
		exp = find_symbol(s->name);
		if (!exp || exp->module == mod) {
1844
			if (have_vmlinux && !s->weak) {
1845 1846 1847 1848 1849 1850 1851 1852
				if (warn_unresolved) {
					warn("\"%s\" [%s.ko] undefined!\n",
					     s->name, mod->name);
				} else {
					merror("\"%s\" [%s.ko] undefined!\n",
					          s->name, mod->name);
					err = 1;
				}
1853
			}
L
Linus Torvalds 已提交
1854 1855 1856 1857 1858 1859 1860 1861
			continue;
		}
		s->module = exp->module;
		s->crc_valid = exp->crc_valid;
		s->crc = exp->crc;
	}

	if (!modversions)
1862
		return err;
L
Linus Torvalds 已提交
1863 1864 1865

	buf_printf(b, "\n");
	buf_printf(b, "static const struct modversion_info ____versions[]\n");
A
Adrian Bunk 已提交
1866
	buf_printf(b, "__used\n");
L
Linus Torvalds 已提交
1867 1868 1869
	buf_printf(b, "__attribute__((section(\"__versions\"))) = {\n");

	for (s = mod->unres; s; s = s->next) {
S
Sam Ravnborg 已提交
1870
		if (!s->module)
L
Linus Torvalds 已提交
1871 1872
			continue;
		if (!s->crc_valid) {
1873
			warn("\"%s\" [%s.ko] has no CRC!\n",
L
Linus Torvalds 已提交
1874 1875 1876 1877 1878 1879 1880
				s->name, mod->name);
			continue;
		}
		buf_printf(b, "\t{ %#8x, \"%s\" },\n", s->crc, s->name);
	}

	buf_printf(b, "};\n");
1881 1882

	return err;
L
Linus Torvalds 已提交
1883 1884
}

1885 1886
static void add_depends(struct buffer *b, struct module *mod,
			struct module *modules)
L
Linus Torvalds 已提交
1887 1888 1889 1890 1891
{
	struct symbol *s;
	struct module *m;
	int first = 1;

S
Sam Ravnborg 已提交
1892
	for (m = modules; m; m = m->next)
L
Linus Torvalds 已提交
1893 1894 1895 1896
		m->seen = is_vmlinux(m->name);

	buf_printf(b, "\n");
	buf_printf(b, "static const char __module_depends[]\n");
A
Adrian Bunk 已提交
1897
	buf_printf(b, "__used\n");
L
Linus Torvalds 已提交
1898 1899 1900
	buf_printf(b, "__attribute__((section(\".modinfo\"))) =\n");
	buf_printf(b, "\"depends=");
	for (s = mod->unres; s; s = s->next) {
1901
		const char *p;
L
Linus Torvalds 已提交
1902 1903 1904 1905 1906 1907 1908
		if (!s->module)
			continue;

		if (s->module->seen)
			continue;

		s->module->seen = 1;
S
Sam Ravnborg 已提交
1909 1910
		p = strrchr(s->module->name, '/');
		if (p)
1911 1912 1913 1914
			p++;
		else
			p = s->module->name;
		buf_printf(b, "%s%s", first ? "" : ",", p);
L
Linus Torvalds 已提交
1915 1916 1917 1918 1919
		first = 0;
	}
	buf_printf(b, "\";\n");
}

1920
static void add_srcversion(struct buffer *b, struct module *mod)
L
Linus Torvalds 已提交
1921 1922 1923 1924 1925 1926 1927 1928
{
	if (mod->srcversion[0]) {
		buf_printf(b, "\n");
		buf_printf(b, "MODULE_INFO(srcversion, \"%s\");\n",
			   mod->srcversion);
	}
}

1929
static void write_if_changed(struct buffer *b, const char *fname)
L
Linus Torvalds 已提交
1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972
{
	char *tmp;
	FILE *file;
	struct stat st;

	file = fopen(fname, "r");
	if (!file)
		goto write;

	if (fstat(fileno(file), &st) < 0)
		goto close_write;

	if (st.st_size != b->pos)
		goto close_write;

	tmp = NOFAIL(malloc(b->pos));
	if (fread(tmp, 1, b->pos, file) != b->pos)
		goto free_write;

	if (memcmp(tmp, b->p, b->pos) != 0)
		goto free_write;

	free(tmp);
	fclose(file);
	return;

 free_write:
	free(tmp);
 close_write:
	fclose(file);
 write:
	file = fopen(fname, "w");
	if (!file) {
		perror(fname);
		exit(1);
	}
	if (fwrite(b->p, 1, b->pos, file) != b->pos) {
		perror(fname);
		exit(1);
	}
	fclose(file);
}

1973
/* parse Module.symvers file. line format:
S
Sam Ravnborg 已提交
1974
 * 0x12345678<tab>symbol<tab>module[[<tab>export]<tab>something]
1975
 **/
1976
static void read_dump(const char *fname, unsigned int kernel)
L
Linus Torvalds 已提交
1977 1978 1979 1980 1981
{
	unsigned long size, pos = 0;
	void *file = grab_file(fname, &size);
	char *line;

S
Sam Ravnborg 已提交
1982
	if (!file)
L
Linus Torvalds 已提交
1983 1984 1985 1986
		/* No symbol versions, silently ignore */
		return;

	while ((line = get_next_line(&pos, file, size))) {
S
Sam Ravnborg 已提交
1987
		char *symname, *modname, *d, *export, *end;
L
Linus Torvalds 已提交
1988 1989
		unsigned int crc;
		struct module *mod;
1990
		struct symbol *s;
L
Linus Torvalds 已提交
1991 1992 1993 1994 1995 1996 1997

		if (!(symname = strchr(line, '\t')))
			goto fail;
		*symname++ = '\0';
		if (!(modname = strchr(symname, '\t')))
			goto fail;
		*modname++ = '\0';
1998
		if ((export = strchr(modname, '\t')) != NULL)
1999
			*export++ = '\0';
S
Sam Ravnborg 已提交
2000 2001
		if (export && ((end = strchr(export, '\t')) != NULL))
			*end = '\0';
L
Linus Torvalds 已提交
2002 2003 2004
		crc = strtoul(line, &d, 16);
		if (*symname == '\0' || *modname == '\0' || *d != '\0')
			goto fail;
S
Sam Ravnborg 已提交
2005 2006 2007
		mod = find_module(modname);
		if (!mod) {
			if (is_vmlinux(modname))
L
Linus Torvalds 已提交
2008
				have_vmlinux = 1;
2009
			mod = new_module(modname);
L
Linus Torvalds 已提交
2010 2011
			mod->skip = 1;
		}
2012
		s = sym_add_exported(symname, mod, export_no(export));
2013 2014
		s->kernel    = kernel;
		s->preloaded = 1;
2015
		sym_update_crc(symname, mod, crc, export_no(export));
L
Linus Torvalds 已提交
2016 2017 2018 2019 2020 2021
	}
	return;
fail:
	fatal("parse error in symbol dump file\n");
}

2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033
/* For normal builds always dump all symbols.
 * For external modules only dump symbols
 * that are not read from kernel Module.symvers.
 **/
static int dump_sym(struct symbol *sym)
{
	if (!external_module)
		return 1;
	if (sym->vmlinux || sym->kernel)
		return 0;
	return 1;
}
2034

2035
static void write_dump(const char *fname)
L
Linus Torvalds 已提交
2036 2037 2038 2039 2040 2041 2042 2043
{
	struct buffer buf = { };
	struct symbol *symbol;
	int n;

	for (n = 0; n < SYMBOL_HASH_SIZE ; n++) {
		symbol = symbolhash[n];
		while (symbol) {
2044
			if (dump_sym(symbol))
2045
				buf_printf(&buf, "0x%08x\t%s\t%s\t%s\n",
2046
					symbol->crc, symbol->name,
2047 2048
					symbol->module->name,
					export_str(symbol->export));
L
Linus Torvalds 已提交
2049 2050 2051 2052 2053 2054
			symbol = symbol->next;
		}
	}
	write_if_changed(&buf, fname);
}

2055 2056 2057 2058 2059
struct ext_sym_list {
	struct ext_sym_list *next;
	const char *file;
};

2060
int main(int argc, char **argv)
L
Linus Torvalds 已提交
2061 2062 2063
{
	struct module *mod;
	struct buffer buf = { };
2064 2065
	char *kernel_read = NULL, *module_read = NULL;
	char *dump_write = NULL;
L
Linus Torvalds 已提交
2066
	int opt;
2067
	int err;
2068 2069
	struct ext_sym_list *extsym_iter;
	struct ext_sym_list *extsym_start = NULL;
L
Linus Torvalds 已提交
2070

2071
	while ((opt = getopt(argc, argv, "i:I:e:cmsSo:awM:K:")) != -1) {
S
Sam Ravnborg 已提交
2072 2073 2074 2075 2076 2077 2078 2079
		switch (opt) {
		case 'i':
			kernel_read = optarg;
			break;
		case 'I':
			module_read = optarg;
			external_module = 1;
			break;
2080 2081 2082
		case 'c':
			cross_build = 1;
			break;
2083 2084 2085 2086 2087 2088 2089 2090
		case 'e':
			external_module = 1;
			extsym_iter =
			   NOFAIL(malloc(sizeof(*extsym_iter)));
			extsym_iter->next = extsym_start;
			extsym_iter->file = optarg;
			extsym_start = extsym_iter;
			break;
S
Sam Ravnborg 已提交
2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102
		case 'm':
			modversions = 1;
			break;
		case 'o':
			dump_write = optarg;
			break;
		case 'a':
			all_versions = 1;
			break;
		case 's':
			vmlinux_section_warnings = 0;
			break;
2103 2104 2105
		case 'S':
			sec_mismatch_verbose = 0;
			break;
S
Sam Ravnborg 已提交
2106 2107 2108 2109 2110
		case 'w':
			warn_unresolved = 1;
			break;
		default:
			exit(1);
L
Linus Torvalds 已提交
2111 2112 2113
		}
	}

2114 2115 2116 2117
	if (kernel_read)
		read_dump(kernel_read, 1);
	if (module_read)
		read_dump(module_read, 0);
2118 2119 2120 2121 2122 2123
	while (extsym_start) {
		read_dump(extsym_start->file, 0);
		extsym_iter = extsym_start->next;
		free(extsym_start);
		extsym_start = extsym_iter;
	}
L
Linus Torvalds 已提交
2124

S
Sam Ravnborg 已提交
2125
	while (optind < argc)
L
Linus Torvalds 已提交
2126 2127
		read_symbols(argv[optind++]);

2128 2129 2130
	for (mod = modules; mod; mod = mod->next) {
		if (mod->skip)
			continue;
2131
		check_exports(mod);
2132 2133
	}

2134 2135
	err = 0;

L
Linus Torvalds 已提交
2136
	for (mod = modules; mod; mod = mod->next) {
2137 2138
		char fname[strlen(mod->name) + 10];

L
Linus Torvalds 已提交
2139 2140 2141 2142 2143 2144
		if (mod->skip)
			continue;

		buf.pos = 0;

		add_header(&buf, mod);
2145
		add_staging_flag(&buf, mod->name);
2146
		err |= add_versions(&buf, mod);
L
Linus Torvalds 已提交
2147 2148 2149 2150 2151 2152 2153 2154 2155 2156
		add_depends(&buf, mod, modules);
		add_moddevtable(&buf, mod);
		add_srcversion(&buf, mod);

		sprintf(fname, "%s.mod.c", mod->name);
		write_if_changed(&buf, fname);
	}

	if (dump_write)
		write_dump(dump_write);
2157
	if (sec_mismatch_count && !sec_mismatch_verbose)
2158 2159 2160 2161
		warn("modpost: Found %d section mismatch(es).\n"
		     "To see full details build your kernel with:\n"
		     "'make CONFIG_DEBUG_SECTION_MISMATCH=y'\n",
		     sec_mismatch_count);
L
Linus Torvalds 已提交
2162

2163
	return err;
L
Linus Torvalds 已提交
2164
}