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