• 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 = NOFAIL(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 	NULL
842 };
843 
844 /*
845  * This is used to find sections missing the SHF_ALLOC flag.
846  * The cause of this is often a section specified in assembler
847  * without "ax" / "aw".
848  */
check_section(const char * modname,struct elf_info * elf,Elf_Shdr * sechdr)849 static void check_section(const char *modname, struct elf_info *elf,
850 			  Elf_Shdr *sechdr)
851 {
852 	const char *sec = sech_name(elf, sechdr);
853 
854 	if (sechdr->sh_type == SHT_PROGBITS &&
855 	    !(sechdr->sh_flags & SHF_ALLOC) &&
856 	    !match(sec, section_white_list)) {
857 		warn("%s (%s): unexpected non-allocatable section.\n"
858 		     "Did you forget to use \"ax\"/\"aw\" in a .S file?\n"
859 		     "Note that for example <linux/init.h> contains\n"
860 		     "section definitions for use in .S files.\n\n",
861 		     modname, sec);
862 	}
863 }
864 
865 
866 
867 #define ALL_INIT_DATA_SECTIONS \
868 	".init.setup", ".init.rodata", ".meminit.rodata", \
869 	".init.data", ".meminit.data"
870 #define ALL_EXIT_DATA_SECTIONS \
871 	".exit.data", ".memexit.data"
872 
873 #define ALL_INIT_TEXT_SECTIONS \
874 	".init.text", ".meminit.text"
875 #define ALL_EXIT_TEXT_SECTIONS \
876 	".exit.text", ".memexit.text"
877 
878 #define ALL_PCI_INIT_SECTIONS	\
879 	".pci_fixup_early", ".pci_fixup_header", ".pci_fixup_final", \
880 	".pci_fixup_enable", ".pci_fixup_resume", \
881 	".pci_fixup_resume_early", ".pci_fixup_suspend"
882 
883 #define ALL_XXXINIT_SECTIONS MEM_INIT_SECTIONS
884 #define ALL_XXXEXIT_SECTIONS MEM_EXIT_SECTIONS
885 
886 #define ALL_INIT_SECTIONS INIT_SECTIONS, ALL_XXXINIT_SECTIONS
887 #define ALL_EXIT_SECTIONS EXIT_SECTIONS, ALL_XXXEXIT_SECTIONS
888 
889 #define DATA_SECTIONS ".data", ".data.rel"
890 #define TEXT_SECTIONS ".text", ".text.unlikely", ".sched.text", \
891 		".kprobes.text"
892 #define OTHER_TEXT_SECTIONS ".ref.text", ".head.text", ".spinlock.text", \
893 		".fixup", ".entry.text", ".exception.text", ".text.*", \
894 		".coldtext"
895 
896 #define INIT_SECTIONS      ".init.*"
897 #define MEM_INIT_SECTIONS  ".meminit.*"
898 
899 #define EXIT_SECTIONS      ".exit.*"
900 #define MEM_EXIT_SECTIONS  ".memexit.*"
901 
902 #define ALL_TEXT_SECTIONS  ALL_INIT_TEXT_SECTIONS, ALL_EXIT_TEXT_SECTIONS, \
903 		TEXT_SECTIONS, OTHER_TEXT_SECTIONS
904 
905 /* init data sections */
906 static const char *const init_data_sections[] =
907 	{ ALL_INIT_DATA_SECTIONS, NULL };
908 
909 /* all init sections */
910 static const char *const init_sections[] = { ALL_INIT_SECTIONS, NULL };
911 
912 /* All init and exit sections (code + data) */
913 static const char *const init_exit_sections[] =
914 	{ALL_INIT_SECTIONS, ALL_EXIT_SECTIONS, NULL };
915 
916 /* all text sections */
917 static const char *const text_sections[] = { ALL_TEXT_SECTIONS, NULL };
918 
919 /* data section */
920 static const char *const data_sections[] = { DATA_SECTIONS, NULL };
921 
922 
923 /* symbols in .data that may refer to init/exit sections */
924 #define DEFAULT_SYMBOL_WHITE_LIST					\
925 	"*driver",							\
926 	"*_template", /* scsi uses *_template a lot */			\
927 	"*_timer",    /* arm uses ops structures named _timer a lot */	\
928 	"*_sht",      /* scsi also used *_sht to some extent */		\
929 	"*_ops",							\
930 	"*_probe",							\
931 	"*_probe_one",							\
932 	"*_console"
933 
934 static const char *const head_sections[] = { ".head.text*", NULL };
935 static const char *const linker_symbols[] =
936 	{ "__init_begin", "_sinittext", "_einittext", NULL };
937 static const char *const optim_symbols[] = { "*.constprop.*", NULL };
938 
939 enum mismatch {
940 	TEXT_TO_ANY_INIT,
941 	DATA_TO_ANY_INIT,
942 	TEXT_TO_ANY_EXIT,
943 	DATA_TO_ANY_EXIT,
944 	XXXINIT_TO_SOME_INIT,
945 	XXXEXIT_TO_SOME_EXIT,
946 	ANY_INIT_TO_ANY_EXIT,
947 	ANY_EXIT_TO_ANY_INIT,
948 	EXPORT_TO_INIT_EXIT,
949 	EXTABLE_TO_NON_TEXT,
950 };
951 
952 /**
953  * Describe how to match sections on different criterias:
954  *
955  * @fromsec: Array of sections to be matched.
956  *
957  * @bad_tosec: Relocations applied to a section in @fromsec to a section in
958  * this array is forbidden (black-list).  Can be empty.
959  *
960  * @good_tosec: Relocations applied to a section in @fromsec must be
961  * targetting sections in this array (white-list).  Can be empty.
962  *
963  * @mismatch: Type of mismatch.
964  *
965  * @symbol_white_list: Do not match a relocation to a symbol in this list
966  * even if it is targetting a section in @bad_to_sec.
967  *
968  * @handler: Specific handler to call when a match is found.  If NULL,
969  * default_mismatch_handler() will be called.
970  *
971  */
972 struct sectioncheck {
973 	const char *fromsec[20];
974 	const char *bad_tosec[20];
975 	const char *good_tosec[20];
976 	enum mismatch mismatch;
977 	const char *symbol_white_list[20];
978 	void (*handler)(const char *modname, struct elf_info *elf,
979 			const struct sectioncheck* const mismatch,
980 			Elf_Rela *r, Elf_Sym *sym, const char *fromsec);
981 
982 };
983 
984 static void extable_mismatch_handler(const char *modname, struct elf_info *elf,
985 				     const struct sectioncheck* const mismatch,
986 				     Elf_Rela *r, Elf_Sym *sym,
987 				     const char *fromsec);
988 
989 static const struct sectioncheck sectioncheck[] = {
990 /* Do not reference init/exit code/data from
991  * normal code and data
992  */
993 {
994 	.fromsec = { TEXT_SECTIONS, NULL },
995 	.bad_tosec = { ALL_INIT_SECTIONS, NULL },
996 	.mismatch = TEXT_TO_ANY_INIT,
997 	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
998 },
999 {
1000 	.fromsec = { DATA_SECTIONS, NULL },
1001 	.bad_tosec = { ALL_XXXINIT_SECTIONS, NULL },
1002 	.mismatch = DATA_TO_ANY_INIT,
1003 	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1004 },
1005 {
1006 	.fromsec = { DATA_SECTIONS, NULL },
1007 	.bad_tosec = { INIT_SECTIONS, NULL },
1008 	.mismatch = DATA_TO_ANY_INIT,
1009 	.symbol_white_list = {
1010 		"*_template", "*_timer", "*_sht", "*_ops",
1011 		"*_probe", "*_probe_one", "*_console", NULL
1012 	},
1013 },
1014 {
1015 	.fromsec = { TEXT_SECTIONS, NULL },
1016 	.bad_tosec = { ALL_EXIT_SECTIONS, NULL },
1017 	.mismatch = TEXT_TO_ANY_EXIT,
1018 	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1019 },
1020 {
1021 	.fromsec = { DATA_SECTIONS, NULL },
1022 	.bad_tosec = { ALL_EXIT_SECTIONS, NULL },
1023 	.mismatch = DATA_TO_ANY_EXIT,
1024 	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1025 },
1026 /* Do not reference init code/data from meminit code/data */
1027 {
1028 	.fromsec = { ALL_XXXINIT_SECTIONS, NULL },
1029 	.bad_tosec = { INIT_SECTIONS, NULL },
1030 	.mismatch = XXXINIT_TO_SOME_INIT,
1031 	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1032 },
1033 /* Do not reference exit code/data from memexit code/data */
1034 {
1035 	.fromsec = { ALL_XXXEXIT_SECTIONS, NULL },
1036 	.bad_tosec = { EXIT_SECTIONS, NULL },
1037 	.mismatch = XXXEXIT_TO_SOME_EXIT,
1038 	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1039 },
1040 /* Do not use exit code/data from init code */
1041 {
1042 	.fromsec = { ALL_INIT_SECTIONS, NULL },
1043 	.bad_tosec = { ALL_EXIT_SECTIONS, NULL },
1044 	.mismatch = ANY_INIT_TO_ANY_EXIT,
1045 	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1046 },
1047 /* Do not use init code/data from exit code */
1048 {
1049 	.fromsec = { ALL_EXIT_SECTIONS, NULL },
1050 	.bad_tosec = { ALL_INIT_SECTIONS, NULL },
1051 	.mismatch = ANY_EXIT_TO_ANY_INIT,
1052 	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1053 },
1054 {
1055 	.fromsec = { ALL_PCI_INIT_SECTIONS, NULL },
1056 	.bad_tosec = { INIT_SECTIONS, NULL },
1057 	.mismatch = ANY_INIT_TO_ANY_EXIT,
1058 	.symbol_white_list = { NULL },
1059 },
1060 /* Do not export init/exit functions or data */
1061 {
1062 	.fromsec = { "__ksymtab*", NULL },
1063 	.bad_tosec = { INIT_SECTIONS, EXIT_SECTIONS, NULL },
1064 	.mismatch = EXPORT_TO_INIT_EXIT,
1065 	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1066 },
1067 {
1068 	.fromsec = { "__ex_table", NULL },
1069 	/* If you're adding any new black-listed sections in here, consider
1070 	 * adding a special 'printer' for them in scripts/check_extable.
1071 	 */
1072 	.bad_tosec = { ".altinstr_replacement", NULL },
1073 	.good_tosec = {ALL_TEXT_SECTIONS , NULL},
1074 	.mismatch = EXTABLE_TO_NON_TEXT,
1075 	.handler = extable_mismatch_handler,
1076 }
1077 };
1078 
section_mismatch(const char * fromsec,const char * tosec)1079 static const struct sectioncheck *section_mismatch(
1080 		const char *fromsec, const char *tosec)
1081 {
1082 	int i;
1083 	int elems = sizeof(sectioncheck) / sizeof(struct sectioncheck);
1084 	const struct sectioncheck *check = &sectioncheck[0];
1085 
1086 	/*
1087 	 * The target section could be the SHT_NUL section when we're
1088 	 * handling relocations to un-resolved symbols, trying to match it
1089 	 * doesn't make much sense and causes build failures on parisc and
1090 	 * mn10300 architectures.
1091 	 */
1092 	if (*tosec == '\0')
1093 		return NULL;
1094 
1095 	for (i = 0; i < elems; i++) {
1096 		if (match(fromsec, check->fromsec)) {
1097 			if (check->bad_tosec[0] && match(tosec, check->bad_tosec))
1098 				return check;
1099 			if (check->good_tosec[0] && !match(tosec, check->good_tosec))
1100 				return check;
1101 		}
1102 		check++;
1103 	}
1104 	return NULL;
1105 }
1106 
1107 /**
1108  * Whitelist to allow certain references to pass with no warning.
1109  *
1110  * Pattern 1:
1111  *   If a module parameter is declared __initdata and permissions=0
1112  *   then this is legal despite the warning generated.
1113  *   We cannot see value of permissions here, so just ignore
1114  *   this pattern.
1115  *   The pattern is identified by:
1116  *   tosec   = .init.data
1117  *   fromsec = .data*
1118  *   atsym   =__param*
1119  *
1120  * Pattern 1a:
1121  *   module_param_call() ops can refer to __init set function if permissions=0
1122  *   The pattern is identified by:
1123  *   tosec   = .init.text
1124  *   fromsec = .data*
1125  *   atsym   = __param_ops_*
1126  *
1127  * Pattern 2:
1128  *   Many drivers utilise a *driver container with references to
1129  *   add, remove, probe functions etc.
1130  *   the pattern is identified by:
1131  *   tosec   = init or exit section
1132  *   fromsec = data section
1133  *   atsym = *driver, *_template, *_sht, *_ops, *_probe,
1134  *           *probe_one, *_console, *_timer
1135  *
1136  * Pattern 3:
1137  *   Whitelist all references from .head.text to any init section
1138  *
1139  * Pattern 4:
1140  *   Some symbols belong to init section but still it is ok to reference
1141  *   these from non-init sections as these symbols don't have any memory
1142  *   allocated for them and symbol address and value are same. So even
1143  *   if init section is freed, its ok to reference those symbols.
1144  *   For ex. symbols marking the init section boundaries.
1145  *   This pattern is identified by
1146  *   refsymname = __init_begin, _sinittext, _einittext
1147  *
1148  * Pattern 5:
1149  *   GCC may optimize static inlines when fed constant arg(s) resulting
1150  *   in functions like cpumask_empty() -- generating an associated symbol
1151  *   cpumask_empty.constprop.3 that appears in the audit.  If the const that
1152  *   is passed in comes from __init, like say nmi_ipi_mask, we get a
1153  *   meaningless section warning.  May need to add isra symbols too...
1154  *   This pattern is identified by
1155  *   tosec   = init section
1156  *   fromsec = text section
1157  *   refsymname = *.constprop.*
1158  *
1159  * Pattern 6:
1160  *   Hide section mismatch warnings for ELF local symbols.  The goal
1161  *   is to eliminate false positive modpost warnings caused by
1162  *   compiler-generated ELF local symbol names such as ".LANCHOR1".
1163  *   Autogenerated symbol names bypass modpost's "Pattern 2"
1164  *   whitelisting, which relies on pattern-matching against symbol
1165  *   names to work.  (One situation where gcc can autogenerate ELF
1166  *   local symbols is when "-fsection-anchors" is used.)
1167  **/
secref_whitelist(const struct sectioncheck * mismatch,const char * fromsec,const char * fromsym,const char * tosec,const char * tosym)1168 static int secref_whitelist(const struct sectioncheck *mismatch,
1169 			    const char *fromsec, const char *fromsym,
1170 			    const char *tosec, const char *tosym)
1171 {
1172 	/* Check for pattern 1 */
1173 	if (match(tosec, init_data_sections) &&
1174 	    match(fromsec, data_sections) &&
1175 	    (strncmp(fromsym, "__param", strlen("__param")) == 0))
1176 		return 0;
1177 
1178 	/* Check for pattern 1a */
1179 	if (strcmp(tosec, ".init.text") == 0 &&
1180 	    match(fromsec, data_sections) &&
1181 	    (strncmp(fromsym, "__param_ops_", strlen("__param_ops_")) == 0))
1182 		return 0;
1183 
1184 	/* Check for pattern 2 */
1185 	if (match(tosec, init_exit_sections) &&
1186 	    match(fromsec, data_sections) &&
1187 	    match(fromsym, mismatch->symbol_white_list))
1188 		return 0;
1189 
1190 	/* Check for pattern 3 */
1191 	if (match(fromsec, head_sections) &&
1192 	    match(tosec, init_sections))
1193 		return 0;
1194 
1195 	/* Check for pattern 4 */
1196 	if (match(tosym, linker_symbols))
1197 		return 0;
1198 
1199 	/* Check for pattern 5 */
1200 	if (match(fromsec, text_sections) &&
1201 	    match(tosec, init_sections) &&
1202 	    match(fromsym, optim_symbols))
1203 		return 0;
1204 
1205 	/* Check for pattern 6 */
1206 	if (strstarts(fromsym, ".L"))
1207 		return 0;
1208 
1209 	return 1;
1210 }
1211 
is_arm_mapping_symbol(const char * str)1212 static inline int is_arm_mapping_symbol(const char *str)
1213 {
1214 	return str[0] == '$' && strchr("axtd", str[1])
1215 	       && (str[2] == '\0' || str[2] == '.');
1216 }
1217 
1218 /*
1219  * If there's no name there, ignore it; likewise, ignore it if it's
1220  * one of the magic symbols emitted used by current ARM tools.
1221  *
1222  * Otherwise if find_symbols_between() returns those symbols, they'll
1223  * fail the whitelist tests and cause lots of false alarms ... fixable
1224  * only by merging __exit and __init sections into __text, bloating
1225  * the kernel (which is especially evil on embedded platforms).
1226  */
is_valid_name(struct elf_info * elf,Elf_Sym * sym)1227 static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym)
1228 {
1229 	const char *name = elf->strtab + sym->st_name;
1230 
1231 	if (!name || !strlen(name))
1232 		return 0;
1233 	return !is_arm_mapping_symbol(name);
1234 }
1235 
1236 /**
1237  * Find symbol based on relocation record info.
1238  * In some cases the symbol supplied is a valid symbol so
1239  * return refsym. If st_name != 0 we assume this is a valid symbol.
1240  * In other cases the symbol needs to be looked up in the symbol table
1241  * based on section and address.
1242  *  **/
find_elf_symbol(struct elf_info * elf,Elf64_Sword addr,Elf_Sym * relsym)1243 static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr,
1244 				Elf_Sym *relsym)
1245 {
1246 	Elf_Sym *sym;
1247 	Elf_Sym *near = NULL;
1248 	Elf64_Sword distance = 20;
1249 	Elf64_Sword d;
1250 	unsigned int relsym_secindex;
1251 
1252 	if (relsym->st_name != 0)
1253 		return relsym;
1254 
1255 	relsym_secindex = get_secindex(elf, relsym);
1256 	for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
1257 		if (get_secindex(elf, sym) != relsym_secindex)
1258 			continue;
1259 		if (ELF_ST_TYPE(sym->st_info) == STT_SECTION)
1260 			continue;
1261 		if (!is_valid_name(elf, sym))
1262 			continue;
1263 		if (sym->st_value == addr)
1264 			return sym;
1265 		/* Find a symbol nearby - addr are maybe negative */
1266 		d = sym->st_value - addr;
1267 		if (d < 0)
1268 			d = addr - sym->st_value;
1269 		if (d < distance) {
1270 			distance = d;
1271 			near = sym;
1272 		}
1273 	}
1274 	/* We need a close match */
1275 	if (distance < 20)
1276 		return near;
1277 	else
1278 		return NULL;
1279 }
1280 
1281 /*
1282  * Find symbols before or equal addr and after addr - in the section sec.
1283  * If we find two symbols with equal offset prefer one with a valid name.
1284  * The ELF format may have a better way to detect what type of symbol
1285  * it is, but this works for now.
1286  **/
find_elf_symbol2(struct elf_info * elf,Elf_Addr addr,const char * sec)1287 static Elf_Sym *find_elf_symbol2(struct elf_info *elf, Elf_Addr addr,
1288 				 const char *sec)
1289 {
1290 	Elf_Sym *sym;
1291 	Elf_Sym *near = NULL;
1292 	Elf_Addr distance = ~0;
1293 
1294 	for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
1295 		const char *symsec;
1296 
1297 		if (is_shndx_special(sym->st_shndx))
1298 			continue;
1299 		symsec = sec_name(elf, get_secindex(elf, sym));
1300 		if (strcmp(symsec, sec) != 0)
1301 			continue;
1302 		if (!is_valid_name(elf, sym))
1303 			continue;
1304 		if (sym->st_value <= addr) {
1305 			if ((addr - sym->st_value) < distance) {
1306 				distance = addr - sym->st_value;
1307 				near = sym;
1308 			} else if ((addr - sym->st_value) == distance) {
1309 				near = sym;
1310 			}
1311 		}
1312 	}
1313 	return near;
1314 }
1315 
1316 /*
1317  * Convert a section name to the function/data attribute
1318  * .init.text => __init
1319  * .memexitconst => __memconst
1320  * etc.
1321  *
1322  * The memory of returned value has been allocated on a heap. The user of this
1323  * method should free it after usage.
1324 */
sec2annotation(const char * s)1325 static char *sec2annotation(const char *s)
1326 {
1327 	if (match(s, init_exit_sections)) {
1328 		char *p = NOFAIL(malloc(20));
1329 		char *r = p;
1330 
1331 		*p++ = '_';
1332 		*p++ = '_';
1333 		if (*s == '.')
1334 			s++;
1335 		while (*s && *s != '.')
1336 			*p++ = *s++;
1337 		*p = '\0';
1338 		if (*s == '.')
1339 			s++;
1340 		if (strstr(s, "rodata") != NULL)
1341 			strcat(p, "const ");
1342 		else if (strstr(s, "data") != NULL)
1343 			strcat(p, "data ");
1344 		else
1345 			strcat(p, " ");
1346 		return r;
1347 	} else {
1348 		return NOFAIL(strdup(""));
1349 	}
1350 }
1351 
is_function(Elf_Sym * sym)1352 static int is_function(Elf_Sym *sym)
1353 {
1354 	if (sym)
1355 		return ELF_ST_TYPE(sym->st_info) == STT_FUNC;
1356 	else
1357 		return -1;
1358 }
1359 
print_section_list(const char * const list[20])1360 static void print_section_list(const char * const list[20])
1361 {
1362 	const char *const *s = list;
1363 
1364 	while (*s) {
1365 		fprintf(stderr, "%s", *s);
1366 		s++;
1367 		if (*s)
1368 			fprintf(stderr, ", ");
1369 	}
1370 	fprintf(stderr, "\n");
1371 }
1372 
get_pretty_name(int is_func,const char ** name,const char ** name_p)1373 static inline void get_pretty_name(int is_func, const char** name, const char** name_p)
1374 {
1375 	switch (is_func) {
1376 	case 0:	*name = "variable"; *name_p = ""; break;
1377 	case 1:	*name = "function"; *name_p = "()"; break;
1378 	default: *name = "(unknown reference)"; *name_p = ""; break;
1379 	}
1380 }
1381 
1382 /*
1383  * Print a warning about a section mismatch.
1384  * Try to find symbols near it so user can find it.
1385  * Check whitelist before warning - it may be a false positive.
1386  */
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)1387 static void report_sec_mismatch(const char *modname,
1388 				const struct sectioncheck *mismatch,
1389 				const char *fromsec,
1390 				unsigned long long fromaddr,
1391 				const char *fromsym,
1392 				int from_is_func,
1393 				const char *tosec, const char *tosym,
1394 				int to_is_func)
1395 {
1396 	const char *from, *from_p;
1397 	const char *to, *to_p;
1398 	char *prl_from;
1399 	char *prl_to;
1400 
1401 	sec_mismatch_count++;
1402 	if (!sec_mismatch_verbose)
1403 		return;
1404 
1405 	get_pretty_name(from_is_func, &from, &from_p);
1406 	get_pretty_name(to_is_func, &to, &to_p);
1407 
1408 	warn("%s(%s+0x%llx): Section mismatch in reference from the %s %s%s "
1409 	     "to the %s %s:%s%s\n",
1410 	     modname, fromsec, fromaddr, from, fromsym, from_p, to, tosec,
1411 	     tosym, to_p);
1412 
1413 	switch (mismatch->mismatch) {
1414 	case TEXT_TO_ANY_INIT:
1415 		prl_from = sec2annotation(fromsec);
1416 		prl_to = sec2annotation(tosec);
1417 		fprintf(stderr,
1418 		"The function %s%s() references\n"
1419 		"the %s %s%s%s.\n"
1420 		"This is often because %s lacks a %s\n"
1421 		"annotation or the annotation of %s is wrong.\n",
1422 		prl_from, fromsym,
1423 		to, prl_to, tosym, to_p,
1424 		fromsym, prl_to, tosym);
1425 		free(prl_from);
1426 		free(prl_to);
1427 		break;
1428 	case DATA_TO_ANY_INIT: {
1429 		prl_to = sec2annotation(tosec);
1430 		fprintf(stderr,
1431 		"The variable %s references\n"
1432 		"the %s %s%s%s\n"
1433 		"If the reference is valid then annotate the\n"
1434 		"variable with __init* or __refdata (see linux/init.h) "
1435 		"or name the variable:\n",
1436 		fromsym, to, prl_to, tosym, to_p);
1437 		print_section_list(mismatch->symbol_white_list);
1438 		free(prl_to);
1439 		break;
1440 	}
1441 	case TEXT_TO_ANY_EXIT:
1442 		prl_to = sec2annotation(tosec);
1443 		fprintf(stderr,
1444 		"The function %s() references a %s in an exit section.\n"
1445 		"Often the %s %s%s has valid usage outside the exit section\n"
1446 		"and the fix is to remove the %sannotation of %s.\n",
1447 		fromsym, to, to, tosym, to_p, prl_to, tosym);
1448 		free(prl_to);
1449 		break;
1450 	case DATA_TO_ANY_EXIT: {
1451 		prl_to = sec2annotation(tosec);
1452 		fprintf(stderr,
1453 		"The variable %s references\n"
1454 		"the %s %s%s%s\n"
1455 		"If the reference is valid then annotate the\n"
1456 		"variable with __exit* (see linux/init.h) or "
1457 		"name the variable:\n",
1458 		fromsym, to, prl_to, tosym, to_p);
1459 		print_section_list(mismatch->symbol_white_list);
1460 		free(prl_to);
1461 		break;
1462 	}
1463 	case XXXINIT_TO_SOME_INIT:
1464 	case XXXEXIT_TO_SOME_EXIT:
1465 		prl_from = sec2annotation(fromsec);
1466 		prl_to = sec2annotation(tosec);
1467 		fprintf(stderr,
1468 		"The %s %s%s%s references\n"
1469 		"a %s %s%s%s.\n"
1470 		"If %s is only used by %s then\n"
1471 		"annotate %s with a matching annotation.\n",
1472 		from, prl_from, fromsym, from_p,
1473 		to, prl_to, tosym, to_p,
1474 		tosym, fromsym, tosym);
1475 		free(prl_from);
1476 		free(prl_to);
1477 		break;
1478 	case ANY_INIT_TO_ANY_EXIT:
1479 		prl_from = sec2annotation(fromsec);
1480 		prl_to = sec2annotation(tosec);
1481 		fprintf(stderr,
1482 		"The %s %s%s%s references\n"
1483 		"a %s %s%s%s.\n"
1484 		"This is often seen when error handling "
1485 		"in the init function\n"
1486 		"uses functionality in the exit path.\n"
1487 		"The fix is often to remove the %sannotation of\n"
1488 		"%s%s so it may be used outside an exit section.\n",
1489 		from, prl_from, fromsym, from_p,
1490 		to, prl_to, tosym, to_p,
1491 		prl_to, tosym, to_p);
1492 		free(prl_from);
1493 		free(prl_to);
1494 		break;
1495 	case ANY_EXIT_TO_ANY_INIT:
1496 		prl_from = sec2annotation(fromsec);
1497 		prl_to = sec2annotation(tosec);
1498 		fprintf(stderr,
1499 		"The %s %s%s%s references\n"
1500 		"a %s %s%s%s.\n"
1501 		"This is often seen when error handling "
1502 		"in the exit function\n"
1503 		"uses functionality in the init path.\n"
1504 		"The fix is often to remove the %sannotation of\n"
1505 		"%s%s so it may be used outside an init section.\n",
1506 		from, prl_from, fromsym, from_p,
1507 		to, prl_to, tosym, to_p,
1508 		prl_to, tosym, to_p);
1509 		free(prl_from);
1510 		free(prl_to);
1511 		break;
1512 	case EXPORT_TO_INIT_EXIT:
1513 		prl_to = sec2annotation(tosec);
1514 		fprintf(stderr,
1515 		"The symbol %s is exported and annotated %s\n"
1516 		"Fix this by removing the %sannotation of %s "
1517 		"or drop the export.\n",
1518 		tosym, prl_to, prl_to, tosym);
1519 		free(prl_to);
1520 		break;
1521 	case EXTABLE_TO_NON_TEXT:
1522 		fatal("There's a special handler for this mismatch type, "
1523 		      "we should never get here.");
1524 		break;
1525 	}
1526 	fprintf(stderr, "\n");
1527 }
1528 
default_mismatch_handler(const char * modname,struct elf_info * elf,const struct sectioncheck * const mismatch,Elf_Rela * r,Elf_Sym * sym,const char * fromsec)1529 static void default_mismatch_handler(const char *modname, struct elf_info *elf,
1530 				     const struct sectioncheck* const mismatch,
1531 				     Elf_Rela *r, Elf_Sym *sym, const char *fromsec)
1532 {
1533 	const char *tosec;
1534 	Elf_Sym *to;
1535 	Elf_Sym *from;
1536 	const char *tosym;
1537 	const char *fromsym;
1538 
1539 	from = find_elf_symbol2(elf, r->r_offset, fromsec);
1540 	fromsym = sym_name(elf, from);
1541 
1542 	if (!strncmp(fromsym, "reference___initcall",
1543 		     sizeof("reference___initcall")-1))
1544 		return;
1545 
1546 	tosec = sec_name(elf, get_secindex(elf, sym));
1547 	to = find_elf_symbol(elf, r->r_addend, sym);
1548 	tosym = sym_name(elf, to);
1549 
1550 	/* check whitelist - we may ignore it */
1551 	if (secref_whitelist(mismatch,
1552 			     fromsec, fromsym, tosec, tosym)) {
1553 		report_sec_mismatch(modname, mismatch,
1554 				    fromsec, r->r_offset, fromsym,
1555 				    is_function(from), tosec, tosym,
1556 				    is_function(to));
1557 	}
1558 }
1559 
is_executable_section(struct elf_info * elf,unsigned int section_index)1560 static int is_executable_section(struct elf_info* elf, unsigned int section_index)
1561 {
1562 	if (section_index > elf->num_sections)
1563 		fatal("section_index is outside elf->num_sections!\n");
1564 
1565 	return ((elf->sechdrs[section_index].sh_flags & SHF_EXECINSTR) == SHF_EXECINSTR);
1566 }
1567 
1568 /*
1569  * We rely on a gross hack in section_rel[a]() calling find_extable_entry_size()
1570  * to know the sizeof(struct exception_table_entry) for the target architecture.
1571  */
1572 static unsigned int extable_entry_size = 0;
find_extable_entry_size(const char * const sec,const Elf_Rela * r)1573 static void find_extable_entry_size(const char* const sec, const Elf_Rela* r)
1574 {
1575 	/*
1576 	 * If we're currently checking the second relocation within __ex_table,
1577 	 * that relocation offset tells us the offsetof(struct
1578 	 * exception_table_entry, fixup) which is equal to sizeof(struct
1579 	 * exception_table_entry) divided by two.  We use that to our advantage
1580 	 * since there's no portable way to get that size as every architecture
1581 	 * seems to go with different sized types.  Not pretty but better than
1582 	 * hard-coding the size for every architecture..
1583 	 */
1584 	if (!extable_entry_size)
1585 		extable_entry_size = r->r_offset * 2;
1586 }
1587 
is_extable_fault_address(Elf_Rela * r)1588 static inline bool is_extable_fault_address(Elf_Rela *r)
1589 {
1590 	/*
1591 	 * extable_entry_size is only discovered after we've handled the
1592 	 * _second_ relocation in __ex_table, so only abort when we're not
1593 	 * handling the first reloc and extable_entry_size is zero.
1594 	 */
1595 	if (r->r_offset && extable_entry_size == 0)
1596 		fatal("extable_entry size hasn't been discovered!\n");
1597 
1598 	return ((r->r_offset == 0) ||
1599 		(r->r_offset % extable_entry_size == 0));
1600 }
1601 
1602 #define is_second_extable_reloc(Start, Cur, Sec)			\
1603 	(((Cur) == (Start) + 1) && (strcmp("__ex_table", (Sec)) == 0))
1604 
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)1605 static void report_extable_warnings(const char* modname, struct elf_info* elf,
1606 				    const struct sectioncheck* const mismatch,
1607 				    Elf_Rela* r, Elf_Sym* sym,
1608 				    const char* fromsec, const char* tosec)
1609 {
1610 	Elf_Sym* fromsym = find_elf_symbol2(elf, r->r_offset, fromsec);
1611 	const char* fromsym_name = sym_name(elf, fromsym);
1612 	Elf_Sym* tosym = find_elf_symbol(elf, r->r_addend, sym);
1613 	const char* tosym_name = sym_name(elf, tosym);
1614 	const char* from_pretty_name;
1615 	const char* from_pretty_name_p;
1616 	const char* to_pretty_name;
1617 	const char* to_pretty_name_p;
1618 
1619 	get_pretty_name(is_function(fromsym),
1620 			&from_pretty_name, &from_pretty_name_p);
1621 	get_pretty_name(is_function(tosym),
1622 			&to_pretty_name, &to_pretty_name_p);
1623 
1624 	warn("%s(%s+0x%lx): Section mismatch in reference"
1625 	     " from the %s %s%s to the %s %s:%s%s\n",
1626 	     modname, fromsec, (long)r->r_offset, from_pretty_name,
1627 	     fromsym_name, from_pretty_name_p,
1628 	     to_pretty_name, tosec, tosym_name, to_pretty_name_p);
1629 
1630 	if (!match(tosec, mismatch->bad_tosec) &&
1631 	    is_executable_section(elf, get_secindex(elf, sym)))
1632 		fprintf(stderr,
1633 			"The relocation at %s+0x%lx references\n"
1634 			"section \"%s\" which is not in the list of\n"
1635 			"authorized sections.  If you're adding a new section\n"
1636 			"and/or if this reference is valid, add \"%s\" to the\n"
1637 			"list of authorized sections to jump to on fault.\n"
1638 			"This can be achieved by adding \"%s\" to \n"
1639 			"OTHER_TEXT_SECTIONS in scripts/mod/modpost.c.\n",
1640 			fromsec, (long)r->r_offset, tosec, tosec, tosec);
1641 }
1642 
extable_mismatch_handler(const char * modname,struct elf_info * elf,const struct sectioncheck * const mismatch,Elf_Rela * r,Elf_Sym * sym,const char * fromsec)1643 static void extable_mismatch_handler(const char* modname, struct elf_info *elf,
1644 				     const struct sectioncheck* const mismatch,
1645 				     Elf_Rela* r, Elf_Sym* sym,
1646 				     const char *fromsec)
1647 {
1648 	const char* tosec = sec_name(elf, get_secindex(elf, sym));
1649 
1650 	sec_mismatch_count++;
1651 
1652 	if (sec_mismatch_verbose)
1653 		report_extable_warnings(modname, elf, mismatch, r, sym,
1654 					fromsec, tosec);
1655 
1656 	if (match(tosec, mismatch->bad_tosec))
1657 		fatal("The relocation at %s+0x%lx references\n"
1658 		      "section \"%s\" which is black-listed.\n"
1659 		      "Something is seriously wrong and should be fixed.\n"
1660 		      "You might get more information about where this is\n"
1661 		      "coming from by using scripts/check_extable.sh %s\n",
1662 		      fromsec, (long)r->r_offset, tosec, modname);
1663 	else if (!is_executable_section(elf, get_secindex(elf, sym))) {
1664 		if (is_extable_fault_address(r))
1665 			fatal("The relocation at %s+0x%lx references\n"
1666 			      "section \"%s\" which is not executable, IOW\n"
1667 			      "it is not possible for the kernel to fault\n"
1668 			      "at that address.  Something is seriously wrong\n"
1669 			      "and should be fixed.\n",
1670 			      fromsec, (long)r->r_offset, tosec);
1671 		else
1672 			fatal("The relocation at %s+0x%lx references\n"
1673 			      "section \"%s\" which is not executable, IOW\n"
1674 			      "the kernel will fault if it ever tries to\n"
1675 			      "jump to it.  Something is seriously wrong\n"
1676 			      "and should be fixed.\n",
1677 			      fromsec, (long)r->r_offset, tosec);
1678 	}
1679 }
1680 
check_section_mismatch(const char * modname,struct elf_info * elf,Elf_Rela * r,Elf_Sym * sym,const char * fromsec)1681 static void check_section_mismatch(const char *modname, struct elf_info *elf,
1682 				   Elf_Rela *r, Elf_Sym *sym, const char *fromsec)
1683 {
1684 	const char *tosec = sec_name(elf, get_secindex(elf, sym));;
1685 	const struct sectioncheck *mismatch = section_mismatch(fromsec, tosec);
1686 
1687 	if (mismatch) {
1688 		if (mismatch->handler)
1689 			mismatch->handler(modname, elf,  mismatch,
1690 					  r, sym, fromsec);
1691 		else
1692 			default_mismatch_handler(modname, elf, mismatch,
1693 						 r, sym, fromsec);
1694 	}
1695 }
1696 
reloc_location(struct elf_info * elf,Elf_Shdr * sechdr,Elf_Rela * r)1697 static unsigned int *reloc_location(struct elf_info *elf,
1698 				    Elf_Shdr *sechdr, Elf_Rela *r)
1699 {
1700 	Elf_Shdr *sechdrs = elf->sechdrs;
1701 	int section = sechdr->sh_info;
1702 
1703 	return (void *)elf->hdr + sechdrs[section].sh_offset +
1704 		r->r_offset;
1705 }
1706 
addend_386_rel(struct elf_info * elf,Elf_Shdr * sechdr,Elf_Rela * r)1707 static int addend_386_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1708 {
1709 	unsigned int r_typ = ELF_R_TYPE(r->r_info);
1710 	unsigned int *location = reloc_location(elf, sechdr, r);
1711 
1712 	switch (r_typ) {
1713 	case R_386_32:
1714 		r->r_addend = TO_NATIVE(*location);
1715 		break;
1716 	case R_386_PC32:
1717 		r->r_addend = TO_NATIVE(*location) + 4;
1718 		/* For CONFIG_RELOCATABLE=y */
1719 		if (elf->hdr->e_type == ET_EXEC)
1720 			r->r_addend += r->r_offset;
1721 		break;
1722 	}
1723 	return 0;
1724 }
1725 
1726 #ifndef R_ARM_CALL
1727 #define R_ARM_CALL	28
1728 #endif
1729 #ifndef R_ARM_JUMP24
1730 #define R_ARM_JUMP24	29
1731 #endif
1732 
1733 #ifndef	R_ARM_THM_CALL
1734 #define	R_ARM_THM_CALL		10
1735 #endif
1736 #ifndef	R_ARM_THM_JUMP24
1737 #define	R_ARM_THM_JUMP24	30
1738 #endif
1739 #ifndef	R_ARM_THM_JUMP19
1740 #define	R_ARM_THM_JUMP19	51
1741 #endif
1742 
addend_arm_rel(struct elf_info * elf,Elf_Shdr * sechdr,Elf_Rela * r)1743 static int addend_arm_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1744 {
1745 	unsigned int r_typ = ELF_R_TYPE(r->r_info);
1746 
1747 	switch (r_typ) {
1748 	case R_ARM_ABS32:
1749 		/* From ARM ABI: (S + A) | T */
1750 		r->r_addend = (int)(long)
1751 			      (elf->symtab_start + ELF_R_SYM(r->r_info));
1752 		break;
1753 	case R_ARM_PC24:
1754 	case R_ARM_CALL:
1755 	case R_ARM_JUMP24:
1756 	case R_ARM_THM_CALL:
1757 	case R_ARM_THM_JUMP24:
1758 	case R_ARM_THM_JUMP19:
1759 		/* From ARM ABI: ((S + A) | T) - P */
1760 		r->r_addend = (int)(long)(elf->hdr +
1761 			      sechdr->sh_offset +
1762 			      (r->r_offset - sechdr->sh_addr));
1763 		break;
1764 	default:
1765 		return 1;
1766 	}
1767 	return 0;
1768 }
1769 
addend_mips_rel(struct elf_info * elf,Elf_Shdr * sechdr,Elf_Rela * r)1770 static int addend_mips_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1771 {
1772 	unsigned int r_typ = ELF_R_TYPE(r->r_info);
1773 	unsigned int *location = reloc_location(elf, sechdr, r);
1774 	unsigned int inst;
1775 
1776 	if (r_typ == R_MIPS_HI16)
1777 		return 1;	/* skip this */
1778 	inst = TO_NATIVE(*location);
1779 	switch (r_typ) {
1780 	case R_MIPS_LO16:
1781 		r->r_addend = inst & 0xffff;
1782 		break;
1783 	case R_MIPS_26:
1784 		r->r_addend = (inst & 0x03ffffff) << 2;
1785 		break;
1786 	case R_MIPS_32:
1787 		r->r_addend = inst;
1788 		break;
1789 	}
1790 	return 0;
1791 }
1792 
section_rela(const char * modname,struct elf_info * elf,Elf_Shdr * sechdr)1793 static void section_rela(const char *modname, struct elf_info *elf,
1794 			 Elf_Shdr *sechdr)
1795 {
1796 	Elf_Sym  *sym;
1797 	Elf_Rela *rela;
1798 	Elf_Rela r;
1799 	unsigned int r_sym;
1800 	const char *fromsec;
1801 
1802 	Elf_Rela *start = (void *)elf->hdr + sechdr->sh_offset;
1803 	Elf_Rela *stop  = (void *)start + sechdr->sh_size;
1804 
1805 	fromsec = sech_name(elf, sechdr);
1806 	fromsec += strlen(".rela");
1807 	/* if from section (name) is know good then skip it */
1808 	if (match(fromsec, section_white_list))
1809 		return;
1810 
1811 	for (rela = start; rela < stop; rela++) {
1812 		r.r_offset = TO_NATIVE(rela->r_offset);
1813 #if KERNEL_ELFCLASS == ELFCLASS64
1814 		if (elf->hdr->e_machine == EM_MIPS) {
1815 			unsigned int r_typ;
1816 			r_sym = ELF64_MIPS_R_SYM(rela->r_info);
1817 			r_sym = TO_NATIVE(r_sym);
1818 			r_typ = ELF64_MIPS_R_TYPE(rela->r_info);
1819 			r.r_info = ELF64_R_INFO(r_sym, r_typ);
1820 		} else {
1821 			r.r_info = TO_NATIVE(rela->r_info);
1822 			r_sym = ELF_R_SYM(r.r_info);
1823 		}
1824 #else
1825 		r.r_info = TO_NATIVE(rela->r_info);
1826 		r_sym = ELF_R_SYM(r.r_info);
1827 #endif
1828 		r.r_addend = TO_NATIVE(rela->r_addend);
1829 		sym = elf->symtab_start + r_sym;
1830 		/* Skip special sections */
1831 		if (is_shndx_special(sym->st_shndx))
1832 			continue;
1833 		if (is_second_extable_reloc(start, rela, fromsec))
1834 			find_extable_entry_size(fromsec, &r);
1835 		check_section_mismatch(modname, elf, &r, sym, fromsec);
1836 	}
1837 }
1838 
section_rel(const char * modname,struct elf_info * elf,Elf_Shdr * sechdr)1839 static void section_rel(const char *modname, struct elf_info *elf,
1840 			Elf_Shdr *sechdr)
1841 {
1842 	Elf_Sym *sym;
1843 	Elf_Rel *rel;
1844 	Elf_Rela r;
1845 	unsigned int r_sym;
1846 	const char *fromsec;
1847 
1848 	Elf_Rel *start = (void *)elf->hdr + sechdr->sh_offset;
1849 	Elf_Rel *stop  = (void *)start + sechdr->sh_size;
1850 
1851 	fromsec = sech_name(elf, sechdr);
1852 	fromsec += strlen(".rel");
1853 	/* if from section (name) is know good then skip it */
1854 	if (match(fromsec, section_white_list))
1855 		return;
1856 
1857 	for (rel = start; rel < stop; rel++) {
1858 		r.r_offset = TO_NATIVE(rel->r_offset);
1859 #if KERNEL_ELFCLASS == ELFCLASS64
1860 		if (elf->hdr->e_machine == EM_MIPS) {
1861 			unsigned int r_typ;
1862 			r_sym = ELF64_MIPS_R_SYM(rel->r_info);
1863 			r_sym = TO_NATIVE(r_sym);
1864 			r_typ = ELF64_MIPS_R_TYPE(rel->r_info);
1865 			r.r_info = ELF64_R_INFO(r_sym, r_typ);
1866 		} else {
1867 			r.r_info = TO_NATIVE(rel->r_info);
1868 			r_sym = ELF_R_SYM(r.r_info);
1869 		}
1870 #else
1871 		r.r_info = TO_NATIVE(rel->r_info);
1872 		r_sym = ELF_R_SYM(r.r_info);
1873 #endif
1874 		r.r_addend = 0;
1875 		switch (elf->hdr->e_machine) {
1876 		case EM_386:
1877 			if (addend_386_rel(elf, sechdr, &r))
1878 				continue;
1879 			break;
1880 		case EM_ARM:
1881 			if (addend_arm_rel(elf, sechdr, &r))
1882 				continue;
1883 			break;
1884 		case EM_MIPS:
1885 			if (addend_mips_rel(elf, sechdr, &r))
1886 				continue;
1887 			break;
1888 		}
1889 		sym = elf->symtab_start + r_sym;
1890 		/* Skip special sections */
1891 		if (is_shndx_special(sym->st_shndx))
1892 			continue;
1893 		if (is_second_extable_reloc(start, rel, fromsec))
1894 			find_extable_entry_size(fromsec, &r);
1895 		check_section_mismatch(modname, elf, &r, sym, fromsec);
1896 	}
1897 }
1898 
1899 /**
1900  * A module includes a number of sections that are discarded
1901  * either when loaded or when used as built-in.
1902  * For loaded modules all functions marked __init and all data
1903  * marked __initdata will be discarded when the module has been initialized.
1904  * Likewise for modules used built-in the sections marked __exit
1905  * are discarded because __exit marked function are supposed to be called
1906  * only when a module is unloaded which never happens for built-in modules.
1907  * The check_sec_ref() function traverses all relocation records
1908  * to find all references to a section that reference a section that will
1909  * be discarded and warns about it.
1910  **/
check_sec_ref(struct module * mod,const char * modname,struct elf_info * elf)1911 static void check_sec_ref(struct module *mod, const char *modname,
1912 			  struct elf_info *elf)
1913 {
1914 	int i;
1915 	Elf_Shdr *sechdrs = elf->sechdrs;
1916 
1917 	/* Walk through all sections */
1918 	for (i = 0; i < elf->num_sections; i++) {
1919 		check_section(modname, elf, &elf->sechdrs[i]);
1920 		/* We want to process only relocation sections and not .init */
1921 		if (sechdrs[i].sh_type == SHT_RELA)
1922 			section_rela(modname, elf, &elf->sechdrs[i]);
1923 		else if (sechdrs[i].sh_type == SHT_REL)
1924 			section_rel(modname, elf, &elf->sechdrs[i]);
1925 	}
1926 }
1927 
remove_dot(char * s)1928 static char *remove_dot(char *s)
1929 {
1930 	size_t n = strcspn(s, ".");
1931 
1932 	if (n && s[n]) {
1933 		size_t m = strspn(s + n + 1, "0123456789");
1934 		if (m && (s[n + m] == '.' || s[n + m] == 0))
1935 			s[n] = 0;
1936 	}
1937 	return s;
1938 }
1939 
read_symbols(char * modname)1940 static void read_symbols(char *modname)
1941 {
1942 	const char *symname;
1943 	char *version;
1944 	char *license;
1945 	struct module *mod;
1946 	struct elf_info info = { };
1947 	Elf_Sym *sym;
1948 
1949 	if (!parse_elf(&info, modname))
1950 		return;
1951 
1952 	mod = new_module(modname);
1953 
1954 	/* When there's no vmlinux, don't print warnings about
1955 	 * unresolved symbols (since there'll be too many ;) */
1956 	if (is_vmlinux(modname)) {
1957 		have_vmlinux = 1;
1958 		mod->skip = 1;
1959 	}
1960 
1961 	license = get_modinfo(info.modinfo, info.modinfo_len, "license");
1962 	if (info.modinfo && !license && !is_vmlinux(modname))
1963 		warn("modpost: missing MODULE_LICENSE() in %s\n"
1964 		     "see include/linux/module.h for "
1965 		     "more information\n", modname);
1966 	while (license) {
1967 		if (license_is_gpl_compatible(license))
1968 			mod->gpl_compatible = 1;
1969 		else {
1970 			mod->gpl_compatible = 0;
1971 			break;
1972 		}
1973 		license = get_next_modinfo(info.modinfo, info.modinfo_len,
1974 					   "license", license);
1975 	}
1976 
1977 	for (sym = info.symtab_start; sym < info.symtab_stop; sym++) {
1978 		symname = remove_dot(info.strtab + sym->st_name);
1979 
1980 		handle_modversions(mod, &info, sym, symname);
1981 		handle_moddevtable(mod, &info, sym, symname);
1982 	}
1983 	if (!is_vmlinux(modname) ||
1984 	     (is_vmlinux(modname) && vmlinux_section_warnings))
1985 		check_sec_ref(mod, modname, &info);
1986 
1987 	version = get_modinfo(info.modinfo, info.modinfo_len, "version");
1988 	if (version)
1989 		maybe_frob_rcs_version(modname, version, info.modinfo,
1990 				       version - (char *)info.hdr);
1991 	if (version || (all_versions && !is_vmlinux(modname)))
1992 		get_src_version(modname, mod->srcversion,
1993 				sizeof(mod->srcversion)-1);
1994 
1995 	parse_elf_finish(&info);
1996 
1997 	/* Our trick to get versioning for module struct etc. - it's
1998 	 * never passed as an argument to an exported function, so
1999 	 * the automatic versioning doesn't pick it up, but it's really
2000 	 * important anyhow */
2001 	if (modversions)
2002 		mod->unres = alloc_symbol("module_layout", 0, mod->unres);
2003 }
2004 
read_symbols_from_files(const char * filename)2005 static void read_symbols_from_files(const char *filename)
2006 {
2007 	FILE *in = stdin;
2008 	char fname[PATH_MAX];
2009 
2010 	if (strcmp(filename, "-") != 0) {
2011 		in = fopen(filename, "r");
2012 		if (!in)
2013 			fatal("Can't open filenames file %s: %m", filename);
2014 	}
2015 
2016 	while (fgets(fname, PATH_MAX, in) != NULL) {
2017 		if (strends(fname, "\n"))
2018 			fname[strlen(fname)-1] = '\0';
2019 		read_symbols(fname);
2020 	}
2021 
2022 	if (in != stdin)
2023 		fclose(in);
2024 }
2025 
2026 #define SZ 500
2027 
2028 /* We first write the generated file into memory using the
2029  * following helper, then compare to the file on disk and
2030  * only update the later if anything changed */
2031 
buf_printf(struct buffer * buf,const char * fmt,...)2032 void __attribute__((format(printf, 2, 3))) buf_printf(struct buffer *buf,
2033 						      const char *fmt, ...)
2034 {
2035 	char tmp[SZ];
2036 	int len;
2037 	va_list ap;
2038 
2039 	va_start(ap, fmt);
2040 	len = vsnprintf(tmp, SZ, fmt, ap);
2041 	buf_write(buf, tmp, len);
2042 	va_end(ap);
2043 }
2044 
buf_write(struct buffer * buf,const char * s,int len)2045 void buf_write(struct buffer *buf, const char *s, int len)
2046 {
2047 	if (buf->size - buf->pos < len) {
2048 		buf->size += len + SZ;
2049 		buf->p = NOFAIL(realloc(buf->p, buf->size));
2050 	}
2051 	strncpy(buf->p + buf->pos, s, len);
2052 	buf->pos += len;
2053 }
2054 
check_for_gpl_usage(enum export exp,const char * m,const char * s)2055 static void check_for_gpl_usage(enum export exp, const char *m, const char *s)
2056 {
2057 	const char *e = is_vmlinux(m) ?"":".ko";
2058 
2059 	switch (exp) {
2060 	case export_gpl:
2061 		fatal("modpost: GPL-incompatible module %s%s "
2062 		      "uses GPL-only symbol '%s'\n", m, e, s);
2063 		break;
2064 	case export_unused_gpl:
2065 		fatal("modpost: GPL-incompatible module %s%s "
2066 		      "uses GPL-only symbol marked UNUSED '%s'\n", m, e, s);
2067 		break;
2068 	case export_gpl_future:
2069 		warn("modpost: GPL-incompatible module %s%s "
2070 		      "uses future GPL-only symbol '%s'\n", m, e, s);
2071 		break;
2072 	case export_plain:
2073 	case export_unused:
2074 	case export_unknown:
2075 		/* ignore */
2076 		break;
2077 	}
2078 }
2079 
check_for_unused(enum export exp,const char * m,const char * s)2080 static void check_for_unused(enum export exp, const char *m, const char *s)
2081 {
2082 	const char *e = is_vmlinux(m) ?"":".ko";
2083 
2084 	switch (exp) {
2085 	case export_unused:
2086 	case export_unused_gpl:
2087 		warn("modpost: module %s%s "
2088 		      "uses symbol '%s' marked UNUSED\n", m, e, s);
2089 		break;
2090 	default:
2091 		/* ignore */
2092 		break;
2093 	}
2094 }
2095 
check_exports(struct module * mod)2096 static void check_exports(struct module *mod)
2097 {
2098 	struct symbol *s, *exp;
2099 
2100 	for (s = mod->unres; s; s = s->next) {
2101 		const char *basename;
2102 		exp = find_symbol(s->name);
2103 		if (!exp || exp->module == mod)
2104 			continue;
2105 		basename = strrchr(mod->name, '/');
2106 		if (basename)
2107 			basename++;
2108 		else
2109 			basename = mod->name;
2110 		if (!mod->gpl_compatible)
2111 			check_for_gpl_usage(exp->export, basename, exp->name);
2112 		check_for_unused(exp->export, basename, exp->name);
2113 	}
2114 }
2115 
2116 /**
2117  * Header for the generated file
2118  **/
add_header(struct buffer * b,struct module * mod)2119 static void add_header(struct buffer *b, struct module *mod)
2120 {
2121 	buf_printf(b, "#include <linux/module.h>\n");
2122 	buf_printf(b, "#include <linux/vermagic.h>\n");
2123 	buf_printf(b, "#include <linux/compiler.h>\n");
2124 	buf_printf(b, "\n");
2125 	buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n");
2126 	buf_printf(b, "\n");
2127 	buf_printf(b, "__visible struct module __this_module\n");
2128 	buf_printf(b, "__attribute__((section(\".gnu.linkonce.this_module\"))) = {\n");
2129 	buf_printf(b, "\t.name = KBUILD_MODNAME,\n");
2130 	if (mod->has_init)
2131 		buf_printf(b, "\t.init = init_module,\n");
2132 	if (mod->has_cleanup)
2133 		buf_printf(b, "#ifdef CONFIG_MODULE_UNLOAD\n"
2134 			      "\t.exit = cleanup_module,\n"
2135 			      "#endif\n");
2136 	buf_printf(b, "\t.arch = MODULE_ARCH_INIT,\n");
2137 	buf_printf(b, "};\n");
2138 }
2139 
add_intree_flag(struct buffer * b,int is_intree)2140 static void add_intree_flag(struct buffer *b, int is_intree)
2141 {
2142 	if (is_intree)
2143 		buf_printf(b, "\nMODULE_INFO(intree, \"Y\");\n");
2144 }
2145 
2146 /* Cannot check for assembler */
add_retpoline(struct buffer * b)2147 static void add_retpoline(struct buffer *b)
2148 {
2149 	buf_printf(b, "\n#ifdef RETPOLINE\n");
2150 	buf_printf(b, "MODULE_INFO(retpoline, \"Y\");\n");
2151 	buf_printf(b, "#endif\n");
2152 }
2153 
add_staging_flag(struct buffer * b,const char * name)2154 static void add_staging_flag(struct buffer *b, const char *name)
2155 {
2156 	static const char *staging_dir = "drivers/staging";
2157 
2158 	if (strncmp(staging_dir, name, strlen(staging_dir)) == 0)
2159 		buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n");
2160 }
2161 
2162 /* In kernel, this size is defined in linux/module.h;
2163  * here we use Elf_Addr instead of long for covering cross-compile
2164  */
2165 #define MODULE_NAME_LEN (64 - sizeof(Elf_Addr))
2166 
2167 /**
2168  * Record CRCs for unresolved symbols
2169  **/
add_versions(struct buffer * b,struct module * mod)2170 static int add_versions(struct buffer *b, struct module *mod)
2171 {
2172 	struct symbol *s, *exp;
2173 	int err = 0;
2174 
2175 	for (s = mod->unres; s; s = s->next) {
2176 		exp = find_symbol(s->name);
2177 		if (!exp || exp->module == mod) {
2178 			if (have_vmlinux && !s->weak) {
2179 				if (warn_unresolved) {
2180 					warn("\"%s\" [%s.ko] undefined!\n",
2181 					     s->name, mod->name);
2182 				} else {
2183 					merror("\"%s\" [%s.ko] undefined!\n",
2184 					       s->name, mod->name);
2185 					err = 1;
2186 				}
2187 			}
2188 			continue;
2189 		}
2190 		s->module = exp->module;
2191 		s->crc_valid = exp->crc_valid;
2192 		s->crc = exp->crc;
2193 	}
2194 
2195 	if (!modversions)
2196 		return err;
2197 
2198 	buf_printf(b, "\n");
2199 	buf_printf(b, "static const struct modversion_info ____versions[]\n");
2200 	buf_printf(b, "__used\n");
2201 	buf_printf(b, "__attribute__((section(\"__versions\"))) = {\n");
2202 
2203 	for (s = mod->unres; s; s = s->next) {
2204 		if (!s->module)
2205 			continue;
2206 		if (!s->crc_valid) {
2207 			warn("\"%s\" [%s.ko] has no CRC!\n",
2208 				s->name, mod->name);
2209 			continue;
2210 		}
2211 		if (strlen(s->name) >= MODULE_NAME_LEN) {
2212 			merror("too long symbol \"%s\" [%s.ko]\n",
2213 			       s->name, mod->name);
2214 			err = 1;
2215 			break;
2216 		}
2217 		buf_printf(b, "\t{ %#8x, __VMLINUX_SYMBOL_STR(%s) },\n",
2218 			   s->crc, s->name);
2219 	}
2220 
2221 	buf_printf(b, "};\n");
2222 
2223 	return err;
2224 }
2225 
add_depends(struct buffer * b,struct module * mod,struct module * modules)2226 static void add_depends(struct buffer *b, struct module *mod,
2227 			struct module *modules)
2228 {
2229 	struct symbol *s;
2230 	struct module *m;
2231 	int first = 1;
2232 
2233 	for (m = modules; m; m = m->next)
2234 		m->seen = is_vmlinux(m->name);
2235 
2236 	buf_printf(b, "\n");
2237 	buf_printf(b, "static const char __module_depends[]\n");
2238 	buf_printf(b, "__used\n");
2239 	buf_printf(b, "__attribute__((section(\".modinfo\"))) =\n");
2240 	buf_printf(b, "\"depends=");
2241 	for (s = mod->unres; s; s = s->next) {
2242 		const char *p;
2243 		if (!s->module)
2244 			continue;
2245 
2246 		if (s->module->seen)
2247 			continue;
2248 
2249 		s->module->seen = 1;
2250 		p = strrchr(s->module->name, '/');
2251 		if (p)
2252 			p++;
2253 		else
2254 			p = s->module->name;
2255 		buf_printf(b, "%s%s", first ? "" : ",", p);
2256 		first = 0;
2257 	}
2258 	buf_printf(b, "\";\n");
2259 }
2260 
add_srcversion(struct buffer * b,struct module * mod)2261 static void add_srcversion(struct buffer *b, struct module *mod)
2262 {
2263 	if (mod->srcversion[0]) {
2264 		buf_printf(b, "\n");
2265 		buf_printf(b, "MODULE_INFO(srcversion, \"%s\");\n",
2266 			   mod->srcversion);
2267 	}
2268 }
2269 
write_if_changed(struct buffer * b,const char * fname)2270 static void write_if_changed(struct buffer *b, const char *fname)
2271 {
2272 	char *tmp;
2273 	FILE *file;
2274 	struct stat st;
2275 
2276 	file = fopen(fname, "r");
2277 	if (!file)
2278 		goto write;
2279 
2280 	if (fstat(fileno(file), &st) < 0)
2281 		goto close_write;
2282 
2283 	if (st.st_size != b->pos)
2284 		goto close_write;
2285 
2286 	tmp = NOFAIL(malloc(b->pos));
2287 	if (fread(tmp, 1, b->pos, file) != b->pos)
2288 		goto free_write;
2289 
2290 	if (memcmp(tmp, b->p, b->pos) != 0)
2291 		goto free_write;
2292 
2293 	free(tmp);
2294 	fclose(file);
2295 	return;
2296 
2297  free_write:
2298 	free(tmp);
2299  close_write:
2300 	fclose(file);
2301  write:
2302 	file = fopen(fname, "w");
2303 	if (!file) {
2304 		perror(fname);
2305 		exit(1);
2306 	}
2307 	if (fwrite(b->p, 1, b->pos, file) != b->pos) {
2308 		perror(fname);
2309 		exit(1);
2310 	}
2311 	fclose(file);
2312 }
2313 
2314 /* parse Module.symvers file. line format:
2315  * 0x12345678<tab>symbol<tab>module[[<tab>export]<tab>something]
2316  **/
read_dump(const char * fname,unsigned int kernel)2317 static void read_dump(const char *fname, unsigned int kernel)
2318 {
2319 	unsigned long size, pos = 0;
2320 	void *file = grab_file(fname, &size);
2321 	char *line;
2322 
2323 	if (!file)
2324 		/* No symbol versions, silently ignore */
2325 		return;
2326 
2327 	while ((line = get_next_line(&pos, file, size))) {
2328 		char *symname, *modname, *d, *export, *end;
2329 		unsigned int crc;
2330 		struct module *mod;
2331 		struct symbol *s;
2332 
2333 		if (!(symname = strchr(line, '\t')))
2334 			goto fail;
2335 		*symname++ = '\0';
2336 		if (!(modname = strchr(symname, '\t')))
2337 			goto fail;
2338 		*modname++ = '\0';
2339 		if ((export = strchr(modname, '\t')) != NULL)
2340 			*export++ = '\0';
2341 		if (export && ((end = strchr(export, '\t')) != NULL))
2342 			*end = '\0';
2343 		crc = strtoul(line, &d, 16);
2344 		if (*symname == '\0' || *modname == '\0' || *d != '\0')
2345 			goto fail;
2346 		mod = find_module(modname);
2347 		if (!mod) {
2348 			if (is_vmlinux(modname))
2349 				have_vmlinux = 1;
2350 			mod = new_module(modname);
2351 			mod->skip = 1;
2352 		}
2353 		s = sym_add_exported(symname, mod, export_no(export));
2354 		s->kernel    = kernel;
2355 		s->preloaded = 1;
2356 		sym_update_crc(symname, mod, crc, export_no(export));
2357 	}
2358 	release_file(file, size);
2359 	return;
2360 fail:
2361 	release_file(file, size);
2362 	fatal("parse error in symbol dump file\n");
2363 }
2364 
2365 /* For normal builds always dump all symbols.
2366  * For external modules only dump symbols
2367  * that are not read from kernel Module.symvers.
2368  **/
dump_sym(struct symbol * sym)2369 static int dump_sym(struct symbol *sym)
2370 {
2371 	if (!external_module)
2372 		return 1;
2373 	if (sym->vmlinux || sym->kernel)
2374 		return 0;
2375 	return 1;
2376 }
2377 
write_dump(const char * fname)2378 static void write_dump(const char *fname)
2379 {
2380 	struct buffer buf = { };
2381 	struct symbol *symbol;
2382 	int n;
2383 
2384 	for (n = 0; n < SYMBOL_HASH_SIZE ; n++) {
2385 		symbol = symbolhash[n];
2386 		while (symbol) {
2387 			if (dump_sym(symbol))
2388 				buf_printf(&buf, "0x%08x\t%s\t%s\t%s\n",
2389 					symbol->crc, symbol->name,
2390 					symbol->module->name,
2391 					export_str(symbol->export));
2392 			symbol = symbol->next;
2393 		}
2394 	}
2395 	write_if_changed(&buf, fname);
2396 }
2397 
2398 struct ext_sym_list {
2399 	struct ext_sym_list *next;
2400 	const char *file;
2401 };
2402 
main(int argc,char ** argv)2403 int main(int argc, char **argv)
2404 {
2405 	struct module *mod;
2406 	struct buffer buf = { };
2407 	char *kernel_read = NULL, *module_read = NULL;
2408 	char *dump_write = NULL, *files_source = NULL;
2409 	int opt;
2410 	int err;
2411 	struct ext_sym_list *extsym_iter;
2412 	struct ext_sym_list *extsym_start = NULL;
2413 
2414 	while ((opt = getopt(argc, argv, "i:I:e:mnsST:o:awM:K:E")) != -1) {
2415 		switch (opt) {
2416 		case 'i':
2417 			kernel_read = optarg;
2418 			break;
2419 		case 'I':
2420 			module_read = optarg;
2421 			external_module = 1;
2422 			break;
2423 		case 'e':
2424 			external_module = 1;
2425 			extsym_iter =
2426 			   NOFAIL(malloc(sizeof(*extsym_iter)));
2427 			extsym_iter->next = extsym_start;
2428 			extsym_iter->file = optarg;
2429 			extsym_start = extsym_iter;
2430 			break;
2431 		case 'm':
2432 			modversions = 1;
2433 			break;
2434 		case 'n':
2435 			ignore_missing_files = 1;
2436 			break;
2437 		case 'o':
2438 			dump_write = optarg;
2439 			break;
2440 		case 'a':
2441 			all_versions = 1;
2442 			break;
2443 		case 's':
2444 			vmlinux_section_warnings = 0;
2445 			break;
2446 		case 'S':
2447 			sec_mismatch_verbose = 0;
2448 			break;
2449 		case 'T':
2450 			files_source = optarg;
2451 			break;
2452 		case 'w':
2453 			warn_unresolved = 1;
2454 			break;
2455 		case 'E':
2456 			sec_mismatch_fatal = 1;
2457 			break;
2458 		default:
2459 			exit(1);
2460 		}
2461 	}
2462 
2463 	if (kernel_read)
2464 		read_dump(kernel_read, 1);
2465 	if (module_read)
2466 		read_dump(module_read, 0);
2467 	while (extsym_start) {
2468 		read_dump(extsym_start->file, 0);
2469 		extsym_iter = extsym_start->next;
2470 		free(extsym_start);
2471 		extsym_start = extsym_iter;
2472 	}
2473 
2474 	while (optind < argc)
2475 		read_symbols(argv[optind++]);
2476 
2477 	if (files_source)
2478 		read_symbols_from_files(files_source);
2479 
2480 	for (mod = modules; mod; mod = mod->next) {
2481 		if (mod->skip)
2482 			continue;
2483 		check_exports(mod);
2484 	}
2485 
2486 	err = 0;
2487 
2488 	for (mod = modules; mod; mod = mod->next) {
2489 		char fname[PATH_MAX];
2490 
2491 		if (mod->skip)
2492 			continue;
2493 
2494 		buf.pos = 0;
2495 
2496 		add_header(&buf, mod);
2497 		add_intree_flag(&buf, !external_module);
2498 		add_retpoline(&buf);
2499 		add_staging_flag(&buf, mod->name);
2500 		err |= add_versions(&buf, mod);
2501 		add_depends(&buf, mod, modules);
2502 		add_moddevtable(&buf, mod);
2503 		add_srcversion(&buf, mod);
2504 
2505 		sprintf(fname, "%s.mod.c", mod->name);
2506 		write_if_changed(&buf, fname);
2507 	}
2508 	if (dump_write)
2509 		write_dump(dump_write);
2510 	if (sec_mismatch_count) {
2511 		if (!sec_mismatch_verbose) {
2512 			warn("modpost: Found %d section mismatch(es).\n"
2513 			     "To see full details build your kernel with:\n"
2514 			     "'make CONFIG_DEBUG_SECTION_MISMATCH=y'\n",
2515 			     sec_mismatch_count);
2516 		}
2517 		if (sec_mismatch_fatal) {
2518 			fatal("modpost: Section mismatches detected.\n"
2519 			      "Set CONFIG_SECTION_MISMATCH_WARN_ONLY=y to allow them.\n");
2520 		}
2521 	}
2522 
2523 	return err;
2524 }
2525