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