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