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