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