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