1
2
3
4
5
6
7
8
9
10
11
12
13
14#define _GNU_SOURCE
15#include <stdio.h>
16#include <ctype.h>
17#include "modpost.h"
18#include "../../include/generated/autoconf.h"
19#include "../../include/linux/license.h"
20
21
22#ifdef CONFIG_SYMBOL_PREFIX
23#define MODULE_SYMBOL_PREFIX CONFIG_SYMBOL_PREFIX
24#else
25#define MODULE_SYMBOL_PREFIX ""
26#endif
27
28
29
30int modversions = 0;
31
32int have_vmlinux = 0;
33
34static int all_versions = 0;
35
36static int external_module = 0;
37
38static int vmlinux_section_warnings = 1;
39
40static int warn_unresolved = 0;
41
42static int sec_mismatch_count = 0;
43static int sec_mismatch_verbose = 1;
44
45enum export {
46 export_plain, export_unused, export_gpl,
47 export_unused_gpl, export_gpl_future, export_unknown
48};
49
50#define PRINTF __attribute__ ((format (printf, 1, 2)))
51
52PRINTF void fatal(const char *fmt, ...)
53{
54 va_list arglist;
55
56 fprintf(stderr, "FATAL: ");
57
58 va_start(arglist, fmt);
59 vfprintf(stderr, fmt, arglist);
60 va_end(arglist);
61
62 exit(1);
63}
64
65PRINTF void warn(const char *fmt, ...)
66{
67 va_list arglist;
68
69 fprintf(stderr, "WARNING: ");
70
71 va_start(arglist, fmt);
72 vfprintf(stderr, fmt, arglist);
73 va_end(arglist);
74}
75
76PRINTF void merror(const char *fmt, ...)
77{
78 va_list arglist;
79
80 fprintf(stderr, "ERROR: ");
81
82 va_start(arglist, fmt);
83 vfprintf(stderr, fmt, arglist);
84 va_end(arglist);
85}
86
87static int is_vmlinux(const char *modname)
88{
89 const char *myname;
90
91 myname = strrchr(modname, '/');
92 if (myname)
93 myname++;
94 else
95 myname = modname;
96
97 return (strcmp(myname, "vmlinux") == 0) ||
98 (strcmp(myname, "vmlinux.o") == 0);
99}
100
101void *do_nofail(void *ptr, const char *expr)
102{
103 if (!ptr)
104 fatal("modpost: Memory allocation failure: %s.\n", expr);
105
106 return ptr;
107}
108
109
110static struct module *modules;
111
112static struct module *find_module(char *modname)
113{
114 struct module *mod;
115
116 for (mod = modules; mod; mod = mod->next)
117 if (strcmp(mod->name, modname) == 0)
118 break;
119 return mod;
120}
121
122static struct module *new_module(char *modname)
123{
124 struct module *mod;
125 char *p, *s;
126
127 mod = NOFAIL(malloc(sizeof(*mod)));
128 memset(mod, 0, sizeof(*mod));
129 p = NOFAIL(strdup(modname));
130
131
132 s = strrchr(p, '.');
133 if (s != NULL)
134 if (strcmp(s, ".o") == 0)
135 *s = '\0';
136
137
138 mod->name = p;
139 mod->gpl_compatible = -1;
140 mod->next = modules;
141 modules = mod;
142
143 return mod;
144}
145
146
147
148
149#define SYMBOL_HASH_SIZE 1024
150
151struct symbol {
152 struct symbol *next;
153 struct module *module;
154 unsigned int crc;
155 int crc_valid;
156 unsigned int weak:1;
157 unsigned int vmlinux:1;
158 unsigned int kernel:1;
159
160 unsigned int preloaded:1;
161 enum export export;
162 char name[0];
163};
164
165static struct symbol *symbolhash[SYMBOL_HASH_SIZE];
166
167
168static inline unsigned int tdb_hash(const char *name)
169{
170 unsigned value;
171 unsigned i;
172
173
174 for (value = 0x238F13AF * strlen(name), i = 0; name[i]; i++)
175 value = (value + (((unsigned char *)name)[i] << (i*5 % 24)));
176
177 return (1103515243 * value + 12345);
178}
179
180
181
182
183
184static struct symbol *alloc_symbol(const char *name, unsigned int weak,
185 struct symbol *next)
186{
187 struct symbol *s = NOFAIL(malloc(sizeof(*s) + strlen(name) + 1));
188
189 memset(s, 0, sizeof(*s));
190 strcpy(s->name, name);
191 s->weak = weak;
192 s->next = next;
193 return s;
194}
195
196
197static struct symbol *new_symbol(const char *name, struct module *module,
198 enum export export)
199{
200 unsigned int hash;
201 struct symbol *new;
202
203 hash = tdb_hash(name) % SYMBOL_HASH_SIZE;
204 new = symbolhash[hash] = alloc_symbol(name, 0, symbolhash[hash]);
205 new->module = module;
206 new->export = export;
207 return new;
208}
209
210static struct symbol *find_symbol(const char *name)
211{
212 struct symbol *s;
213
214
215 if (name[0] == '.')
216 name++;
217
218 for (s = symbolhash[tdb_hash(name) % SYMBOL_HASH_SIZE]; s; s = s->next) {
219 if (strcmp(s->name, name) == 0)
220 return s;
221 }
222 return NULL;
223}
224
225static struct {
226 const char *str;
227 enum export export;
228} export_list[] = {
229 { .str = "EXPORT_SYMBOL", .export = export_plain },
230 { .str = "EXPORT_UNUSED_SYMBOL", .export = export_unused },
231 { .str = "EXPORT_SYMBOL_GPL", .export = export_gpl },
232 { .str = "EXPORT_UNUSED_SYMBOL_GPL", .export = export_unused_gpl },
233 { .str = "EXPORT_SYMBOL_GPL_FUTURE", .export = export_gpl_future },
234 { .str = "(unknown)", .export = export_unknown },
235};
236
237
238static const char *export_str(enum export ex)
239{
240 return export_list[ex].str;
241}
242
243static enum export export_no(const char *s)
244{
245 int i;
246
247 if (!s)
248 return export_unknown;
249 for (i = 0; export_list[i].export != export_unknown; i++) {
250 if (strcmp(export_list[i].str, s) == 0)
251 return export_list[i].export;
252 }
253 return export_unknown;
254}
255
256static enum export export_from_sec(struct elf_info *elf, Elf_Section sec)
257{
258 if (sec == elf->export_sec)
259 return export_plain;
260 else if (sec == elf->export_unused_sec)
261 return export_unused;
262 else if (sec == elf->export_gpl_sec)
263 return export_gpl;
264 else if (sec == elf->export_unused_gpl_sec)
265 return export_unused_gpl;
266 else if (sec == elf->export_gpl_future_sec)
267 return export_gpl_future;
268 else
269 return export_unknown;
270}
271
272
273
274
275
276static struct symbol *sym_add_exported(const char *name, struct module *mod,
277 enum export export)
278{
279 struct symbol *s = find_symbol(name);
280
281 if (!s) {
282 s = new_symbol(name, mod, export);
283 } else {
284 if (!s->preloaded) {
285 warn("%s: '%s' exported twice. Previous export "
286 "was in %s%s\n", mod->name, name,
287 s->module->name,
288 is_vmlinux(s->module->name) ?"":".ko");
289 } else {
290
291 s->module = mod;
292 }
293 }
294 s->preloaded = 0;
295 s->vmlinux = is_vmlinux(mod->name);
296 s->kernel = 0;
297 s->export = export;
298 return s;
299}
300
301static void sym_update_crc(const char *name, struct module *mod,
302 unsigned int crc, enum export export)
303{
304 struct symbol *s = find_symbol(name);
305
306 if (!s)
307 s = new_symbol(name, mod, export);
308 s->crc = crc;
309 s->crc_valid = 1;
310}
311
312void *grab_file(const char *filename, unsigned long *size)
313{
314 struct stat st;
315 void *map;
316 int fd;
317
318 fd = open(filename, O_RDONLY);
319 if (fd < 0 || fstat(fd, &st) != 0)
320 return NULL;
321
322 *size = st.st_size;
323 map = mmap(NULL, *size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
324 close(fd);
325
326 if (map == MAP_FAILED)
327 return NULL;
328 return map;
329}
330
331
332
333
334
335
336char *get_next_line(unsigned long *pos, void *file, unsigned long size)
337{
338 static char line[4096];
339 int skip = 1;
340 size_t len = 0;
341 signed char *p = (signed char *)file + *pos;
342 char *s = line;
343
344 for (; *pos < size ; (*pos)++) {
345 if (skip && isspace(*p)) {
346 p++;
347 continue;
348 }
349 skip = 0;
350 if (*p != '\n' && (*pos < size)) {
351 len++;
352 *s++ = *p++;
353 if (len > 4095)
354 break;
355 } else {
356
357 *s = '\0';
358 return line;
359 }
360 }
361
362 return NULL;
363}
364
365void release_file(void *file, unsigned long size)
366{
367 munmap(file, size);
368}
369
370static int parse_elf(struct elf_info *info, const char *filename)
371{
372 unsigned int i;
373 Elf_Ehdr *hdr;
374 Elf_Shdr *sechdrs;
375 Elf_Sym *sym;
376
377 hdr = grab_file(filename, &info->size);
378 if (!hdr) {
379 perror(filename);
380 exit(1);
381 }
382 info->hdr = hdr;
383 if (info->size < sizeof(*hdr)) {
384
385 return 0;
386 }
387
388 if ((hdr->e_ident[EI_MAG0] != ELFMAG0) ||
389 (hdr->e_ident[EI_MAG1] != ELFMAG1) ||
390 (hdr->e_ident[EI_MAG2] != ELFMAG2) ||
391 (hdr->e_ident[EI_MAG3] != ELFMAG3)) {
392
393 return 0;
394 }
395
396 hdr->e_type = TO_NATIVE(hdr->e_type);
397 hdr->e_machine = TO_NATIVE(hdr->e_machine);
398 hdr->e_version = TO_NATIVE(hdr->e_version);
399 hdr->e_entry = TO_NATIVE(hdr->e_entry);
400 hdr->e_phoff = TO_NATIVE(hdr->e_phoff);
401 hdr->e_shoff = TO_NATIVE(hdr->e_shoff);
402 hdr->e_flags = TO_NATIVE(hdr->e_flags);
403 hdr->e_ehsize = TO_NATIVE(hdr->e_ehsize);
404 hdr->e_phentsize = TO_NATIVE(hdr->e_phentsize);
405 hdr->e_phnum = TO_NATIVE(hdr->e_phnum);
406 hdr->e_shentsize = TO_NATIVE(hdr->e_shentsize);
407 hdr->e_shnum = TO_NATIVE(hdr->e_shnum);
408 hdr->e_shstrndx = TO_NATIVE(hdr->e_shstrndx);
409 sechdrs = (void *)hdr + hdr->e_shoff;
410 info->sechdrs = sechdrs;
411
412
413 if (hdr->e_shoff > info->size) {
414 fatal("section header offset=%lu in file '%s' is bigger than "
415 "filesize=%lu\n", (unsigned long)hdr->e_shoff,
416 filename, info->size);
417 return 0;
418 }
419
420
421 for (i = 0; i < hdr->e_shnum; i++) {
422 sechdrs[i].sh_name = TO_NATIVE(sechdrs[i].sh_name);
423 sechdrs[i].sh_type = TO_NATIVE(sechdrs[i].sh_type);
424 sechdrs[i].sh_flags = TO_NATIVE(sechdrs[i].sh_flags);
425 sechdrs[i].sh_addr = TO_NATIVE(sechdrs[i].sh_addr);
426 sechdrs[i].sh_offset = TO_NATIVE(sechdrs[i].sh_offset);
427 sechdrs[i].sh_size = TO_NATIVE(sechdrs[i].sh_size);
428 sechdrs[i].sh_link = TO_NATIVE(sechdrs[i].sh_link);
429 sechdrs[i].sh_info = TO_NATIVE(sechdrs[i].sh_info);
430 sechdrs[i].sh_addralign = TO_NATIVE(sechdrs[i].sh_addralign);
431 sechdrs[i].sh_entsize = TO_NATIVE(sechdrs[i].sh_entsize);
432 }
433
434 for (i = 1; i < hdr->e_shnum; i++) {
435 const char *secstrings
436 = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset;
437 const char *secname;
438 int nobits = sechdrs[i].sh_type == SHT_NOBITS;
439
440 if (!nobits && sechdrs[i].sh_offset > info->size) {
441 fatal("%s is truncated. sechdrs[i].sh_offset=%lu > "
442 "sizeof(*hrd)=%zu\n", filename,
443 (unsigned long)sechdrs[i].sh_offset,
444 sizeof(*hdr));
445 return 0;
446 }
447 secname = secstrings + sechdrs[i].sh_name;
448 if (strcmp(secname, ".modinfo") == 0) {
449 if (nobits)
450 fatal("%s has NOBITS .modinfo\n", filename);
451 info->modinfo = (void *)hdr + sechdrs[i].sh_offset;
452 info->modinfo_len = sechdrs[i].sh_size;
453 } else if (strcmp(secname, "__ksymtab") == 0)
454 info->export_sec = i;
455 else if (strcmp(secname, "__ksymtab_unused") == 0)
456 info->export_unused_sec = i;
457 else if (strcmp(secname, "__ksymtab_gpl") == 0)
458 info->export_gpl_sec = i;
459 else if (strcmp(secname, "__ksymtab_unused_gpl") == 0)
460 info->export_unused_gpl_sec = i;
461 else if (strcmp(secname, "__ksymtab_gpl_future") == 0)
462 info->export_gpl_future_sec = i;
463
464 if (sechdrs[i].sh_type != SHT_SYMTAB)
465 continue;
466
467 info->symtab_start = (void *)hdr + sechdrs[i].sh_offset;
468 info->symtab_stop = (void *)hdr + sechdrs[i].sh_offset
469 + sechdrs[i].sh_size;
470 info->strtab = (void *)hdr +
471 sechdrs[sechdrs[i].sh_link].sh_offset;
472 }
473 if (!info->symtab_start)
474 fatal("%s has no symtab?\n", filename);
475
476
477 for (sym = info->symtab_start; sym < info->symtab_stop; sym++) {
478 sym->st_shndx = TO_NATIVE(sym->st_shndx);
479 sym->st_name = TO_NATIVE(sym->st_name);
480 sym->st_value = TO_NATIVE(sym->st_value);
481 sym->st_size = TO_NATIVE(sym->st_size);
482 }
483 return 1;
484}
485
486static void parse_elf_finish(struct elf_info *info)
487{
488 release_file(info->hdr, info->size);
489}
490
491static int ignore_undef_symbol(struct elf_info *info, const char *symname)
492{
493
494 if (strcmp(symname, MODULE_SYMBOL_PREFIX "__this_module") == 0)
495 return 1;
496
497 if (strcmp(symname, "_GLOBAL_OFFSET_TABLE_") == 0)
498 return 1;
499 if (info->hdr->e_machine == EM_PPC)
500
501 if (strncmp(symname, "_restgpr_", sizeof("_restgpr_") - 1) == 0 ||
502 strncmp(symname, "_savegpr_", sizeof("_savegpr_") - 1) == 0 ||
503 strncmp(symname, "_rest32gpr_", sizeof("_rest32gpr_") - 1) == 0 ||
504 strncmp(symname, "_save32gpr_", sizeof("_save32gpr_") - 1) == 0)
505 return 1;
506 if (info->hdr->e_machine == EM_PPC64)
507
508 if (strncmp(symname, "_restgpr0_", sizeof("_restgpr0_") - 1) == 0 ||
509 strncmp(symname, "_savegpr0_", sizeof("_savegpr0_") - 1) == 0)
510 return 1;
511
512 return 0;
513}
514
515#define CRC_PFX MODULE_SYMBOL_PREFIX "__crc_"
516#define KSYMTAB_PFX MODULE_SYMBOL_PREFIX "__ksymtab_"
517
518static void handle_modversions(struct module *mod, struct elf_info *info,
519 Elf_Sym *sym, const char *symname)
520{
521 unsigned int crc;
522 enum export export = export_from_sec(info, sym->st_shndx);
523
524 switch (sym->st_shndx) {
525 case SHN_COMMON:
526 warn("\"%s\" [%s] is COMMON symbol\n", symname, mod->name);
527 break;
528 case SHN_ABS:
529
530 if (strncmp(symname, CRC_PFX, strlen(CRC_PFX)) == 0) {
531 crc = (unsigned int) sym->st_value;
532 sym_update_crc(symname + strlen(CRC_PFX), mod, crc,
533 export);
534 }
535 break;
536 case SHN_UNDEF:
537
538 if (ELF_ST_BIND(sym->st_info) != STB_GLOBAL &&
539 ELF_ST_BIND(sym->st_info) != STB_WEAK)
540 break;
541 if (ignore_undef_symbol(info, symname))
542 break;
543
544#if defined(STT_REGISTER) || defined(STT_SPARC_REGISTER)
545
546#ifndef STT_SPARC_REGISTER
547#define STT_SPARC_REGISTER STT_REGISTER
548#endif
549 if (info->hdr->e_machine == EM_SPARC ||
550 info->hdr->e_machine == EM_SPARCV9) {
551
552 if (ELF_ST_TYPE(sym->st_info) == STT_SPARC_REGISTER)
553 break;
554 if (symname[0] == '.') {
555 char *munged = strdup(symname);
556 munged[0] = '_';
557 munged[1] = toupper(munged[1]);
558 symname = munged;
559 }
560 }
561#endif
562
563 if (memcmp(symname, MODULE_SYMBOL_PREFIX,
564 strlen(MODULE_SYMBOL_PREFIX)) == 0) {
565 mod->unres =
566 alloc_symbol(symname +
567 strlen(MODULE_SYMBOL_PREFIX),
568 ELF_ST_BIND(sym->st_info) == STB_WEAK,
569 mod->unres);
570 }
571 break;
572 default:
573
574 if (strncmp(symname, KSYMTAB_PFX, strlen(KSYMTAB_PFX)) == 0) {
575 sym_add_exported(symname + strlen(KSYMTAB_PFX), mod,
576 export);
577 }
578 if (strcmp(symname, MODULE_SYMBOL_PREFIX "init_module") == 0)
579 mod->has_init = 1;
580 if (strcmp(symname, MODULE_SYMBOL_PREFIX "cleanup_module") == 0)
581 mod->has_cleanup = 1;
582 break;
583 }
584}
585
586
587
588
589static char *next_string(char *string, unsigned long *secsize)
590{
591
592 while (string[0]) {
593 string++;
594 if ((*secsize)-- <= 1)
595 return NULL;
596 }
597
598
599 while (!string[0]) {
600 string++;
601 if ((*secsize)-- <= 1)
602 return NULL;
603 }
604 return string;
605}
606
607static char *get_next_modinfo(void *modinfo, unsigned long modinfo_len,
608 const char *tag, char *info)
609{
610 char *p;
611 unsigned int taglen = strlen(tag);
612 unsigned long size = modinfo_len;
613
614 if (info) {
615 size -= info - (char *)modinfo;
616 modinfo = next_string(info, &size);
617 }
618
619 for (p = modinfo; p; p = next_string(p, &size)) {
620 if (strncmp(p, tag, taglen) == 0 && p[taglen] == '=')
621 return p + taglen + 1;
622 }
623 return NULL;
624}
625
626static char *get_modinfo(void *modinfo, unsigned long modinfo_len,
627 const char *tag)
628
629{
630 return get_next_modinfo(modinfo, modinfo_len, tag, NULL);
631}
632
633
634
635
636
637static int strrcmp(const char *s, const char *sub)
638{
639 int slen, sublen;
640
641 if (!s || !sub)
642 return 1;
643
644 slen = strlen(s);
645 sublen = strlen(sub);
646
647 if ((slen == 0) || (sublen == 0))
648 return 1;
649
650 if (sublen > slen)
651 return 1;
652
653 return memcmp(s + slen - sublen, sub, sublen);
654}
655
656static const char *sym_name(struct elf_info *elf, Elf_Sym *sym)
657{
658 if (sym)
659 return elf->strtab + sym->st_name;
660 else
661 return "(unknown)";
662}
663
664static const char *sec_name(struct elf_info *elf, int shndx)
665{
666 Elf_Shdr *sechdrs = elf->sechdrs;
667 return (void *)elf->hdr +
668 elf->sechdrs[elf->hdr->e_shstrndx].sh_offset +
669 sechdrs[shndx].sh_name;
670}
671
672static const char *sech_name(struct elf_info *elf, Elf_Shdr *sechdr)
673{
674 return (void *)elf->hdr +
675 elf->sechdrs[elf->hdr->e_shstrndx].sh_offset +
676 sechdr->sh_name;
677}
678
679
680
681
682
683static int number_prefix(const char *sym)
684{
685 if (*sym++ == '\0')
686 return 1;
687 if (*sym != '.')
688 return 0;
689 do {
690 char c = *sym++;
691 if (c < '0' || c > '9')
692 return 0;
693 } while (*sym);
694 return 1;
695}
696
697
698
699
700
701
702
703
704
705
706static int match(const char *sym, const char * const pat[])
707{
708 const char *p;
709 while (*pat) {
710 p = *pat++;
711 const char *endp = p + strlen(p) - 1;
712
713
714 if (*p == '*') {
715 if (strrcmp(sym, p + 1) == 0)
716 return 1;
717 }
718
719 else if (*endp == '*') {
720 if (strncmp(sym, p, strlen(p) - 1) == 0)
721 return 1;
722 }
723
724 else if (*endp == '$') {
725 if (strncmp(sym, p, strlen(p) - 1) == 0) {
726 if (number_prefix(sym + strlen(p) - 1))
727 return 1;
728 }
729 }
730
731 else {
732 if (strcmp(p, sym) == 0)
733 return 1;
734 }
735 }
736
737 return 0;
738}
739
740
741static const char *section_white_list[] =
742{
743 ".comment*",
744 ".debug*",
745 ".mdebug*",
746 ".pdr",
747 ".stab*",
748 ".note*",
749 ".got*",
750 ".toc*",
751 NULL
752};
753
754
755
756
757
758
759static void check_section(const char *modname, struct elf_info *elf,
760 Elf_Shdr *sechdr)
761{
762 const char *sec = sech_name(elf, sechdr);
763
764 if (sechdr->sh_type == SHT_PROGBITS &&
765 !(sechdr->sh_flags & SHF_ALLOC) &&
766 !match(sec, section_white_list)) {
767 warn("%s (%s): unexpected non-allocatable section.\n"
768 "Did you forget to use \"ax\"/\"aw\" in a .S file?\n"
769 "Note that for example <linux/init.h> contains\n"
770 "section definitions for use in .S files.\n\n",
771 modname, sec);
772 }
773}
774
775
776
777#define ALL_INIT_DATA_SECTIONS \
778 ".init.setup$", ".init.rodata$", \
779 ".devinit.rodata$", ".cpuinit.rodata$", ".meminit.rodata$" \
780 ".init.data$", ".devinit.data$", ".cpuinit.data$", ".meminit.data$"
781#define ALL_EXIT_DATA_SECTIONS \
782 ".exit.data$", ".devexit.data$", ".cpuexit.data$", ".memexit.data$"
783
784#define ALL_INIT_TEXT_SECTIONS \
785 ".init.text$", ".devinit.text$", ".cpuinit.text$", ".meminit.text$"
786#define ALL_EXIT_TEXT_SECTIONS \
787 ".exit.text$", ".devexit.text$", ".cpuexit.text$", ".memexit.text$"
788
789#define ALL_XXXINIT_SECTIONS DEV_INIT_SECTIONS, CPU_INIT_SECTIONS, \
790 MEM_INIT_SECTIONS
791#define ALL_XXXEXIT_SECTIONS DEV_EXIT_SECTIONS, CPU_EXIT_SECTIONS, \
792 MEM_EXIT_SECTIONS
793
794#define ALL_INIT_SECTIONS INIT_SECTIONS, ALL_XXXINIT_SECTIONS
795#define ALL_EXIT_SECTIONS EXIT_SECTIONS, ALL_XXXEXIT_SECTIONS
796
797#define DATA_SECTIONS ".data$", ".data.rel$"
798#define TEXT_SECTIONS ".text$"
799
800#define INIT_SECTIONS ".init.*"
801#define DEV_INIT_SECTIONS ".devinit.*"
802#define CPU_INIT_SECTIONS ".cpuinit.*"
803#define MEM_INIT_SECTIONS ".meminit.*"
804
805#define EXIT_SECTIONS ".exit.*"
806#define DEV_EXIT_SECTIONS ".devexit.*"
807#define CPU_EXIT_SECTIONS ".cpuexit.*"
808#define MEM_EXIT_SECTIONS ".memexit.*"
809
810
811static const char *init_data_sections[] = { ALL_INIT_DATA_SECTIONS, NULL };
812
813
814static const char *init_sections[] = { ALL_INIT_SECTIONS, NULL };
815
816
817static const char *init_exit_sections[] =
818 {ALL_INIT_SECTIONS, ALL_EXIT_SECTIONS, NULL };
819
820
821static const char *data_sections[] = { DATA_SECTIONS, NULL };
822
823
824
825#define DEFAULT_SYMBOL_WHITE_LIST \
826 "*driver", \
827 "*_template", \
828 "*_timer", \
829 "*_sht", \
830 "*_ops", \
831 "*_probe", \
832 "*_probe_one", \
833 "*_console"
834
835static const char *head_sections[] = { ".head.text*", NULL };
836static const char *linker_symbols[] =
837 { "__init_begin", "_sinittext", "_einittext", NULL };
838
839enum mismatch {
840 TEXT_TO_ANY_INIT,
841 DATA_TO_ANY_INIT,
842 TEXT_TO_ANY_EXIT,
843 DATA_TO_ANY_EXIT,
844 XXXINIT_TO_SOME_INIT,
845 XXXEXIT_TO_SOME_EXIT,
846 ANY_INIT_TO_ANY_EXIT,
847 ANY_EXIT_TO_ANY_INIT,
848 EXPORT_TO_INIT_EXIT,
849};
850
851struct sectioncheck {
852 const char *fromsec[20];
853 const char *tosec[20];
854 enum mismatch mismatch;
855 const char *symbol_white_list[20];
856};
857
858const struct sectioncheck sectioncheck[] = {
859
860
861
862{
863 .fromsec = { TEXT_SECTIONS, NULL },
864 .tosec = { ALL_INIT_SECTIONS, NULL },
865 .mismatch = TEXT_TO_ANY_INIT,
866 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
867},
868{
869 .fromsec = { DATA_SECTIONS, NULL },
870 .tosec = { ALL_XXXINIT_SECTIONS, NULL },
871 .mismatch = DATA_TO_ANY_INIT,
872 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
873},
874{
875 .fromsec = { DATA_SECTIONS, NULL },
876 .tosec = { INIT_SECTIONS, NULL },
877 .mismatch = DATA_TO_ANY_INIT,
878 .symbol_white_list = {
879 "*_template", "*_timer", "*_sht", "*_ops",
880 "*_probe", "*_probe_one", "*_console", NULL
881 },
882},
883{
884 .fromsec = { TEXT_SECTIONS, NULL },
885 .tosec = { ALL_EXIT_SECTIONS, NULL },
886 .mismatch = TEXT_TO_ANY_EXIT,
887 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
888},
889{
890 .fromsec = { DATA_SECTIONS, NULL },
891 .tosec = { ALL_EXIT_SECTIONS, NULL },
892 .mismatch = DATA_TO_ANY_EXIT,
893 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
894},
895
896{
897 .fromsec = { ALL_XXXINIT_SECTIONS, NULL },
898 .tosec = { INIT_SECTIONS, NULL },
899 .mismatch = XXXINIT_TO_SOME_INIT,
900 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
901},
902
903{
904 .fromsec = { MEM_INIT_SECTIONS, NULL },
905 .tosec = { CPU_INIT_SECTIONS, NULL },
906 .mismatch = XXXINIT_TO_SOME_INIT,
907 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
908},
909
910{
911 .fromsec = { CPU_INIT_SECTIONS, NULL },
912 .tosec = { MEM_INIT_SECTIONS, NULL },
913 .mismatch = XXXINIT_TO_SOME_INIT,
914 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
915},
916
917{
918 .fromsec = { ALL_XXXEXIT_SECTIONS, NULL },
919 .tosec = { EXIT_SECTIONS, NULL },
920 .mismatch = XXXEXIT_TO_SOME_EXIT,
921 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
922},
923
924{
925 .fromsec = { MEM_EXIT_SECTIONS, NULL },
926 .tosec = { CPU_EXIT_SECTIONS, NULL },
927 .mismatch = XXXEXIT_TO_SOME_EXIT,
928 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
929},
930
931{
932 .fromsec = { CPU_EXIT_SECTIONS, NULL },
933 .tosec = { MEM_EXIT_SECTIONS, NULL },
934 .mismatch = XXXEXIT_TO_SOME_EXIT,
935 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
936},
937
938{
939 .fromsec = { ALL_INIT_SECTIONS, NULL },
940 .tosec = { ALL_EXIT_SECTIONS, NULL },
941 .mismatch = ANY_INIT_TO_ANY_EXIT,
942 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
943},
944
945{
946 .fromsec = { ALL_EXIT_SECTIONS, NULL },
947 .tosec = { ALL_INIT_SECTIONS, NULL },
948 .mismatch = ANY_EXIT_TO_ANY_INIT,
949 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
950},
951
952{
953 .fromsec = { "__ksymtab*", NULL },
954 .tosec = { INIT_SECTIONS, EXIT_SECTIONS, NULL },
955 .mismatch = EXPORT_TO_INIT_EXIT,
956 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
957}
958};
959
960static const struct sectioncheck *section_mismatch(
961 const char *fromsec, const char *tosec)
962{
963 int i;
964 int elems = sizeof(sectioncheck) / sizeof(struct sectioncheck);
965 const struct sectioncheck *check = §ioncheck[0];
966
967 for (i = 0; i < elems; i++) {
968 if (match(fromsec, check->fromsec) &&
969 match(tosec, check->tosec))
970 return check;
971 check++;
972 }
973 return NULL;
974}
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013static int secref_whitelist(const struct sectioncheck *mismatch,
1014 const char *fromsec, const char *fromsym,
1015 const char *tosec, const char *tosym)
1016{
1017
1018 if (match(tosec, init_data_sections) &&
1019 match(fromsec, data_sections) &&
1020 (strncmp(fromsym, "__param", strlen("__param")) == 0))
1021 return 0;
1022
1023
1024 if (match(tosec, init_exit_sections) &&
1025 match(fromsec, data_sections) &&
1026 match(fromsym, mismatch->symbol_white_list))
1027 return 0;
1028
1029
1030 if (match(fromsec, head_sections) &&
1031 match(tosec, init_sections))
1032 return 0;
1033
1034
1035 if (match(tosym, linker_symbols))
1036 return 0;
1037
1038 return 1;
1039}
1040
1041
1042
1043
1044
1045
1046
1047
1048static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr,
1049 Elf_Sym *relsym)
1050{
1051 Elf_Sym *sym;
1052 Elf_Sym *near = NULL;
1053 Elf64_Sword distance = 20;
1054 Elf64_Sword d;
1055
1056 if (relsym->st_name != 0)
1057 return relsym;
1058 for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
1059 if (sym->st_shndx != relsym->st_shndx)
1060 continue;
1061 if (ELF_ST_TYPE(sym->st_info) == STT_SECTION)
1062 continue;
1063 if (sym->st_value == addr)
1064 return sym;
1065
1066 d = sym->st_value - addr;
1067 if (d < 0)
1068 d = addr - sym->st_value;
1069 if (d < distance) {
1070 distance = d;
1071 near = sym;
1072 }
1073 }
1074
1075 if (distance < 20)
1076 return near;
1077 else
1078 return NULL;
1079}
1080
1081static inline int is_arm_mapping_symbol(const char *str)
1082{
1083 return str[0] == '$' && strchr("atd", str[1])
1084 && (str[2] == '\0' || str[2] == '.');
1085}
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym)
1097{
1098 const char *name = elf->strtab + sym->st_name;
1099
1100 if (!name || !strlen(name))
1101 return 0;
1102 return !is_arm_mapping_symbol(name);
1103}
1104
1105
1106
1107
1108
1109
1110
1111static Elf_Sym *find_elf_symbol2(struct elf_info *elf, Elf_Addr addr,
1112 const char *sec)
1113{
1114 Elf_Sym *sym;
1115 Elf_Sym *near = NULL;
1116 Elf_Addr distance = ~0;
1117
1118 for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
1119 const char *symsec;
1120
1121 if (sym->st_shndx >= SHN_LORESERVE)
1122 continue;
1123 symsec = sec_name(elf, sym->st_shndx);
1124 if (strcmp(symsec, sec) != 0)
1125 continue;
1126 if (!is_valid_name(elf, sym))
1127 continue;
1128 if (sym->st_value <= addr) {
1129 if ((addr - sym->st_value) < distance) {
1130 distance = addr - sym->st_value;
1131 near = sym;
1132 } else if ((addr - sym->st_value) == distance) {
1133 near = sym;
1134 }
1135 }
1136 }
1137 return near;
1138}
1139
1140
1141
1142
1143
1144
1145
1146
1147static char *sec2annotation(const char *s)
1148{
1149 if (match(s, init_exit_sections)) {
1150 char *p = malloc(20);
1151 char *r = p;
1152
1153 *p++ = '_';
1154 *p++ = '_';
1155 if (*s == '.')
1156 s++;
1157 while (*s && *s != '.')
1158 *p++ = *s++;
1159 *p = '\0';
1160 if (*s == '.')
1161 s++;
1162 if (strstr(s, "rodata") != NULL)
1163 strcat(p, "const ");
1164 else if (strstr(s, "data") != NULL)
1165 strcat(p, "data ");
1166 else
1167 strcat(p, " ");
1168 return r;
1169 } else {
1170 return "";
1171 }
1172}
1173
1174static int is_function(Elf_Sym *sym)
1175{
1176 if (sym)
1177 return ELF_ST_TYPE(sym->st_info) == STT_FUNC;
1178 else
1179 return -1;
1180}
1181
1182
1183
1184
1185
1186
1187static void report_sec_mismatch(const char *modname,
1188 const struct sectioncheck *mismatch,
1189 const char *fromsec,
1190 unsigned long long fromaddr,
1191 const char *fromsym,
1192 int from_is_func,
1193 const char *tosec, const char *tosym,
1194 int to_is_func)
1195{
1196 const char *from, *from_p;
1197 const char *to, *to_p;
1198
1199 switch (from_is_func) {
1200 case 0: from = "variable"; from_p = ""; break;
1201 case 1: from = "function"; from_p = "()"; break;
1202 default: from = "(unknown reference)"; from_p = ""; break;
1203 }
1204 switch (to_is_func) {
1205 case 0: to = "variable"; to_p = ""; break;
1206 case 1: to = "function"; to_p = "()"; break;
1207 default: to = "(unknown reference)"; to_p = ""; break;
1208 }
1209
1210 sec_mismatch_count++;
1211 if (!sec_mismatch_verbose)
1212 return;
1213
1214 warn("%s(%s+0x%llx): Section mismatch in reference from the %s %s%s "
1215 "to the %s %s:%s%s\n",
1216 modname, fromsec, fromaddr, from, fromsym, from_p, to, tosec,
1217 tosym, to_p);
1218
1219 switch (mismatch->mismatch) {
1220 case TEXT_TO_ANY_INIT:
1221 fprintf(stderr,
1222 "The function %s%s() references\n"
1223 "the %s %s%s%s.\n"
1224 "This is often because %s lacks a %s\n"
1225 "annotation or the annotation of %s is wrong.\n",
1226 sec2annotation(fromsec), fromsym,
1227 to, sec2annotation(tosec), tosym, to_p,
1228 fromsym, sec2annotation(tosec), tosym);
1229 break;
1230 case DATA_TO_ANY_INIT: {
1231 const char *const *s = mismatch->symbol_white_list;
1232 fprintf(stderr,
1233 "The variable %s references\n"
1234 "the %s %s%s%s\n"
1235 "If the reference is valid then annotate the\n"
1236 "variable with __init* or __refdata (see linux/init.h) "
1237 "or name the variable:\n",
1238 fromsym, to, sec2annotation(tosec), tosym, to_p);
1239 while (*s)
1240 fprintf(stderr, "%s, ", *s++);
1241 fprintf(stderr, "\n");
1242 break;
1243 }
1244 case TEXT_TO_ANY_EXIT:
1245 fprintf(stderr,
1246 "The function %s() references a %s in an exit section.\n"
1247 "Often the %s %s%s has valid usage outside the exit section\n"
1248 "and the fix is to remove the %sannotation of %s.\n",
1249 fromsym, to, to, tosym, to_p, sec2annotation(tosec), tosym);
1250 break;
1251 case DATA_TO_ANY_EXIT: {
1252 const char *const *s = mismatch->symbol_white_list;
1253 fprintf(stderr,
1254 "The variable %s references\n"
1255 "the %s %s%s%s\n"
1256 "If the reference is valid then annotate the\n"
1257 "variable with __exit* (see linux/init.h) or "
1258 "name the variable:\n",
1259 fromsym, to, sec2annotation(tosec), tosym, to_p);
1260 while (*s)
1261 fprintf(stderr, "%s, ", *s++);
1262 fprintf(stderr, "\n");
1263 break;
1264 }
1265 case XXXINIT_TO_SOME_INIT:
1266 case XXXEXIT_TO_SOME_EXIT:
1267 fprintf(stderr,
1268 "The %s %s%s%s references\n"
1269 "a %s %s%s%s.\n"
1270 "If %s is only used by %s then\n"
1271 "annotate %s with a matching annotation.\n",
1272 from, sec2annotation(fromsec), fromsym, from_p,
1273 to, sec2annotation(tosec), tosym, to_p,
1274 tosym, fromsym, tosym);
1275 break;
1276 case ANY_INIT_TO_ANY_EXIT:
1277 fprintf(stderr,
1278 "The %s %s%s%s references\n"
1279 "a %s %s%s%s.\n"
1280 "This is often seen when error handling "
1281 "in the init function\n"
1282 "uses functionality in the exit path.\n"
1283 "The fix is often to remove the %sannotation of\n"
1284 "%s%s so it may be used outside an exit section.\n",
1285 from, sec2annotation(fromsec), fromsym, from_p,
1286 to, sec2annotation(tosec), tosym, to_p,
1287 sec2annotation(tosec), tosym, to_p);
1288 break;
1289 case ANY_EXIT_TO_ANY_INIT:
1290 fprintf(stderr,
1291 "The %s %s%s%s references\n"
1292 "a %s %s%s%s.\n"
1293 "This is often seen when error handling "
1294 "in the exit function\n"
1295 "uses functionality in the init path.\n"
1296 "The fix is often to remove the %sannotation of\n"
1297 "%s%s so it may be used outside an init section.\n",
1298 from, sec2annotation(fromsec), fromsym, from_p,
1299 to, sec2annotation(tosec), tosym, to_p,
1300 sec2annotation(tosec), tosym, to_p);
1301 break;
1302 case EXPORT_TO_INIT_EXIT:
1303 fprintf(stderr,
1304 "The symbol %s is exported and annotated %s\n"
1305 "Fix this by removing the %sannotation of %s "
1306 "or drop the export.\n",
1307 tosym, sec2annotation(tosec), sec2annotation(tosec), tosym);
1308 break;
1309 }
1310 fprintf(stderr, "\n");
1311}
1312
1313static void check_section_mismatch(const char *modname, struct elf_info *elf,
1314 Elf_Rela *r, Elf_Sym *sym, const char *fromsec)
1315{
1316 const char *tosec;
1317 const struct sectioncheck *mismatch;
1318
1319 tosec = sec_name(elf, sym->st_shndx);
1320 mismatch = section_mismatch(fromsec, tosec);
1321 if (mismatch) {
1322 Elf_Sym *to;
1323 Elf_Sym *from;
1324 const char *tosym;
1325 const char *fromsym;
1326
1327 from = find_elf_symbol2(elf, r->r_offset, fromsec);
1328 fromsym = sym_name(elf, from);
1329 to = find_elf_symbol(elf, r->r_addend, sym);
1330 tosym = sym_name(elf, to);
1331
1332
1333 if (secref_whitelist(mismatch,
1334 fromsec, fromsym, tosec, tosym)) {
1335 report_sec_mismatch(modname, mismatch,
1336 fromsec, r->r_offset, fromsym,
1337 is_function(from), tosec, tosym,
1338 is_function(to));
1339 }
1340 }
1341}
1342
1343static unsigned int *reloc_location(struct elf_info *elf,
1344 Elf_Shdr *sechdr, Elf_Rela *r)
1345{
1346 Elf_Shdr *sechdrs = elf->sechdrs;
1347 int section = sechdr->sh_info;
1348
1349 return (void *)elf->hdr + sechdrs[section].sh_offset +
1350 r->r_offset - sechdrs[section].sh_addr;
1351}
1352
1353static int addend_386_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1354{
1355 unsigned int r_typ = ELF_R_TYPE(r->r_info);
1356 unsigned int *location = reloc_location(elf, sechdr, r);
1357
1358 switch (r_typ) {
1359 case R_386_32:
1360 r->r_addend = TO_NATIVE(*location);
1361 break;
1362 case R_386_PC32:
1363 r->r_addend = TO_NATIVE(*location) + 4;
1364
1365 if (elf->hdr->e_type == ET_EXEC)
1366 r->r_addend += r->r_offset;
1367 break;
1368 }
1369 return 0;
1370}
1371
1372static int addend_arm_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1373{
1374 unsigned int r_typ = ELF_R_TYPE(r->r_info);
1375
1376 switch (r_typ) {
1377 case R_ARM_ABS32:
1378
1379 r->r_addend = (int)(long)
1380 (elf->symtab_start + ELF_R_SYM(r->r_info));
1381 break;
1382 case R_ARM_PC24:
1383
1384 r->r_addend = (int)(long)(elf->hdr +
1385 sechdr->sh_offset +
1386 (r->r_offset - sechdr->sh_addr));
1387 break;
1388 default:
1389 return 1;
1390 }
1391 return 0;
1392}
1393
1394static int addend_mips_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1395{
1396 unsigned int r_typ = ELF_R_TYPE(r->r_info);
1397 unsigned int *location = reloc_location(elf, sechdr, r);
1398 unsigned int inst;
1399
1400 if (r_typ == R_MIPS_HI16)
1401 return 1;
1402 inst = TO_NATIVE(*location);
1403 switch (r_typ) {
1404 case R_MIPS_LO16:
1405 r->r_addend = inst & 0xffff;
1406 break;
1407 case R_MIPS_26:
1408 r->r_addend = (inst & 0x03ffffff) << 2;
1409 break;
1410 case R_MIPS_32:
1411 r->r_addend = inst;
1412 break;
1413 }
1414 return 0;
1415}
1416
1417static void section_rela(const char *modname, struct elf_info *elf,
1418 Elf_Shdr *sechdr)
1419{
1420 Elf_Sym *sym;
1421 Elf_Rela *rela;
1422 Elf_Rela r;
1423 unsigned int r_sym;
1424 const char *fromsec;
1425
1426 Elf_Rela *start = (void *)elf->hdr + sechdr->sh_offset;
1427 Elf_Rela *stop = (void *)start + sechdr->sh_size;
1428
1429 fromsec = sech_name(elf, sechdr);
1430 fromsec += strlen(".rela");
1431
1432 if (match(fromsec, section_white_list))
1433 return;
1434
1435 for (rela = start; rela < stop; rela++) {
1436 r.r_offset = TO_NATIVE(rela->r_offset);
1437#if KERNEL_ELFCLASS == ELFCLASS64
1438 if (elf->hdr->e_machine == EM_MIPS) {
1439 unsigned int r_typ;
1440 r_sym = ELF64_MIPS_R_SYM(rela->r_info);
1441 r_sym = TO_NATIVE(r_sym);
1442 r_typ = ELF64_MIPS_R_TYPE(rela->r_info);
1443 r.r_info = ELF64_R_INFO(r_sym, r_typ);
1444 } else {
1445 r.r_info = TO_NATIVE(rela->r_info);
1446 r_sym = ELF_R_SYM(r.r_info);
1447 }
1448#else
1449 r.r_info = TO_NATIVE(rela->r_info);
1450 r_sym = ELF_R_SYM(r.r_info);
1451#endif
1452 r.r_addend = TO_NATIVE(rela->r_addend);
1453 sym = elf->symtab_start + r_sym;
1454
1455 if (sym->st_shndx >= SHN_LORESERVE)
1456 continue;
1457 check_section_mismatch(modname, elf, &r, sym, fromsec);
1458 }
1459}
1460
1461static void section_rel(const char *modname, struct elf_info *elf,
1462 Elf_Shdr *sechdr)
1463{
1464 Elf_Sym *sym;
1465 Elf_Rel *rel;
1466 Elf_Rela r;
1467 unsigned int r_sym;
1468 const char *fromsec;
1469
1470 Elf_Rel *start = (void *)elf->hdr + sechdr->sh_offset;
1471 Elf_Rel *stop = (void *)start + sechdr->sh_size;
1472
1473 fromsec = sech_name(elf, sechdr);
1474 fromsec += strlen(".rel");
1475
1476 if (match(fromsec, section_white_list))
1477 return;
1478
1479 for (rel = start; rel < stop; rel++) {
1480 r.r_offset = TO_NATIVE(rel->r_offset);
1481#if KERNEL_ELFCLASS == ELFCLASS64
1482 if (elf->hdr->e_machine == EM_MIPS) {
1483 unsigned int r_typ;
1484 r_sym = ELF64_MIPS_R_SYM(rel->r_info);
1485 r_sym = TO_NATIVE(r_sym);
1486 r_typ = ELF64_MIPS_R_TYPE(rel->r_info);
1487 r.r_info = ELF64_R_INFO(r_sym, r_typ);
1488 } else {
1489 r.r_info = TO_NATIVE(rel->r_info);
1490 r_sym = ELF_R_SYM(r.r_info);
1491 }
1492#else
1493 r.r_info = TO_NATIVE(rel->r_info);
1494 r_sym = ELF_R_SYM(r.r_info);
1495#endif
1496 r.r_addend = 0;
1497 switch (elf->hdr->e_machine) {
1498 case EM_386:
1499 if (addend_386_rel(elf, sechdr, &r))
1500 continue;
1501 break;
1502 case EM_ARM:
1503 if (addend_arm_rel(elf, sechdr, &r))
1504 continue;
1505 break;
1506 case EM_MIPS:
1507 if (addend_mips_rel(elf, sechdr, &r))
1508 continue;
1509 break;
1510 }
1511 sym = elf->symtab_start + r_sym;
1512
1513 if (sym->st_shndx >= SHN_LORESERVE)
1514 continue;
1515 check_section_mismatch(modname, elf, &r, sym, fromsec);
1516 }
1517}
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531static void check_sec_ref(struct module *mod, const char *modname,
1532 struct elf_info *elf)
1533{
1534 int i;
1535 Elf_Shdr *sechdrs = elf->sechdrs;
1536
1537
1538 for (i = 0; i < elf->hdr->e_shnum; i++) {
1539 check_section(modname, elf, &elf->sechdrs[i]);
1540
1541 if (sechdrs[i].sh_type == SHT_RELA)
1542 section_rela(modname, elf, &elf->sechdrs[i]);
1543 else if (sechdrs[i].sh_type == SHT_REL)
1544 section_rel(modname, elf, &elf->sechdrs[i]);
1545 }
1546}
1547
1548static void read_symbols(char *modname)
1549{
1550 const char *symname;
1551 char *version;
1552 char *license;
1553 struct module *mod;
1554 struct elf_info info = { };
1555 Elf_Sym *sym;
1556
1557 if (!parse_elf(&info, modname))
1558 return;
1559
1560 mod = new_module(modname);
1561
1562
1563
1564 if (is_vmlinux(modname)) {
1565 have_vmlinux = 1;
1566 mod->skip = 1;
1567 }
1568
1569 license = get_modinfo(info.modinfo, info.modinfo_len, "license");
1570 if (info.modinfo && !license && !is_vmlinux(modname))
1571 warn("modpost: missing MODULE_LICENSE() in %s\n"
1572 "see include/linux/module.h for "
1573 "more information\n", modname);
1574 while (license) {
1575 if (license_is_gpl_compatible(license))
1576 mod->gpl_compatible = 1;
1577 else {
1578 mod->gpl_compatible = 0;
1579 break;
1580 }
1581 license = get_next_modinfo(info.modinfo, info.modinfo_len,
1582 "license", license);
1583 }
1584
1585 for (sym = info.symtab_start; sym < info.symtab_stop; sym++) {
1586 symname = info.strtab + sym->st_name;
1587
1588 handle_modversions(mod, &info, sym, symname);
1589 handle_moddevtable(mod, &info, sym, symname);
1590 }
1591 if (!is_vmlinux(modname) ||
1592 (is_vmlinux(modname) && vmlinux_section_warnings))
1593 check_sec_ref(mod, modname, &info);
1594
1595 version = get_modinfo(info.modinfo, info.modinfo_len, "version");
1596 if (version)
1597 maybe_frob_rcs_version(modname, version, info.modinfo,
1598 version - (char *)info.hdr);
1599 if (version || (all_versions && !is_vmlinux(modname)))
1600 get_src_version(modname, mod->srcversion,
1601 sizeof(mod->srcversion)-1);
1602
1603 parse_elf_finish(&info);
1604
1605
1606
1607
1608
1609 if (modversions)
1610 mod->unres = alloc_symbol("module_layout", 0, mod->unres);
1611}
1612
1613#define SZ 500
1614
1615
1616
1617
1618
1619void __attribute__((format(printf, 2, 3))) buf_printf(struct buffer *buf,
1620 const char *fmt, ...)
1621{
1622 char tmp[SZ];
1623 int len;
1624 va_list ap;
1625
1626 va_start(ap, fmt);
1627 len = vsnprintf(tmp, SZ, fmt, ap);
1628 buf_write(buf, tmp, len);
1629 va_end(ap);
1630}
1631
1632void buf_write(struct buffer *buf, const char *s, int len)
1633{
1634 if (buf->size - buf->pos < len) {
1635 buf->size += len + SZ;
1636 buf->p = realloc(buf->p, buf->size);
1637 }
1638 strncpy(buf->p + buf->pos, s, len);
1639 buf->pos += len;
1640}
1641
1642static void check_for_gpl_usage(enum export exp, const char *m, const char *s)
1643{
1644 const char *e = is_vmlinux(m) ?"":".ko";
1645
1646 switch (exp) {
1647 case export_gpl:
1648 fatal("modpost: GPL-incompatible module %s%s "
1649 "uses GPL-only symbol '%s'\n", m, e, s);
1650 break;
1651 case export_unused_gpl:
1652 fatal("modpost: GPL-incompatible module %s%s "
1653 "uses GPL-only symbol marked UNUSED '%s'\n", m, e, s);
1654 break;
1655 case export_gpl_future:
1656 warn("modpost: GPL-incompatible module %s%s "
1657 "uses future GPL-only symbol '%s'\n", m, e, s);
1658 break;
1659 case export_plain:
1660 case export_unused:
1661 case export_unknown:
1662
1663 break;
1664 }
1665}
1666
1667static void check_for_unused(enum export exp, const char *m, const char *s)
1668{
1669 const char *e = is_vmlinux(m) ?"":".ko";
1670
1671 switch (exp) {
1672 case export_unused:
1673 case export_unused_gpl:
1674 warn("modpost: module %s%s "
1675 "uses symbol '%s' marked UNUSED\n", m, e, s);
1676 break;
1677 default:
1678
1679 break;
1680 }
1681}
1682
1683static void check_exports(struct module *mod)
1684{
1685 struct symbol *s, *exp;
1686
1687 for (s = mod->unres; s; s = s->next) {
1688 const char *basename;
1689 exp = find_symbol(s->name);
1690 if (!exp || exp->module == mod)
1691 continue;
1692 basename = strrchr(mod->name, '/');
1693 if (basename)
1694 basename++;
1695 else
1696 basename = mod->name;
1697 if (!mod->gpl_compatible)
1698 check_for_gpl_usage(exp->export, basename, exp->name);
1699 check_for_unused(exp->export, basename, exp->name);
1700 }
1701}
1702
1703
1704
1705
1706static void add_header(struct buffer *b, struct module *mod)
1707{
1708 buf_printf(b, "#include <linux/module.h>\n");
1709 buf_printf(b, "#include <linux/vermagic.h>\n");
1710 buf_printf(b, "#include <linux/compiler.h>\n");
1711 buf_printf(b, "\n");
1712 buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n");
1713 buf_printf(b, "\n");
1714 buf_printf(b, "struct module __this_module\n");
1715 buf_printf(b, "__attribute__((section(\".gnu.linkonce.this_module\"))) = {\n");
1716 buf_printf(b, " .name = KBUILD_MODNAME,\n");
1717 if (mod->has_init)
1718 buf_printf(b, " .init = init_module,\n");
1719 if (mod->has_cleanup)
1720 buf_printf(b, "#ifdef CONFIG_MODULE_UNLOAD\n"
1721 " .exit = cleanup_module,\n"
1722 "#endif\n");
1723 buf_printf(b, " .arch = MODULE_ARCH_INIT,\n");
1724 buf_printf(b, "};\n");
1725}
1726
1727static void add_staging_flag(struct buffer *b, const char *name)
1728{
1729 static const char *staging_dir = "drivers/staging";
1730
1731 if (strncmp(staging_dir, name, strlen(staging_dir)) == 0)
1732 buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n");
1733}
1734
1735
1736
1737
1738static int add_versions(struct buffer *b, struct module *mod)
1739{
1740 struct symbol *s, *exp;
1741 int err = 0;
1742
1743 for (s = mod->unres; s; s = s->next) {
1744 exp = find_symbol(s->name);
1745 if (!exp || exp->module == mod) {
1746 if (have_vmlinux && !s->weak) {
1747 if (warn_unresolved) {
1748 warn("\"%s\" [%s.ko] undefined!\n",
1749 s->name, mod->name);
1750 } else {
1751 merror("\"%s\" [%s.ko] undefined!\n",
1752 s->name, mod->name);
1753 err = 1;
1754 }
1755 }
1756 continue;
1757 }
1758 s->module = exp->module;
1759 s->crc_valid = exp->crc_valid;
1760 s->crc = exp->crc;
1761 }
1762
1763 if (!modversions)
1764 return err;
1765
1766 buf_printf(b, "\n");
1767 buf_printf(b, "static const struct modversion_info ____versions[]\n");
1768 buf_printf(b, "__used\n");
1769 buf_printf(b, "__attribute__((section(\"__versions\"))) = {\n");
1770
1771 for (s = mod->unres; s; s = s->next) {
1772 if (!s->module)
1773 continue;
1774 if (!s->crc_valid) {
1775 warn("\"%s\" [%s.ko] has no CRC!\n",
1776 s->name, mod->name);
1777 continue;
1778 }
1779 buf_printf(b, "\t{ %#8x, \"%s\" },\n", s->crc, s->name);
1780 }
1781
1782 buf_printf(b, "};\n");
1783
1784 return err;
1785}
1786
1787static void add_depends(struct buffer *b, struct module *mod,
1788 struct module *modules)
1789{
1790 struct symbol *s;
1791 struct module *m;
1792 int first = 1;
1793
1794 for (m = modules; m; m = m->next)
1795 m->seen = is_vmlinux(m->name);
1796
1797 buf_printf(b, "\n");
1798 buf_printf(b, "static const char __module_depends[]\n");
1799 buf_printf(b, "__used\n");
1800 buf_printf(b, "__attribute__((section(\".modinfo\"))) =\n");
1801 buf_printf(b, "\"depends=");
1802 for (s = mod->unres; s; s = s->next) {
1803 const char *p;
1804 if (!s->module)
1805 continue;
1806
1807 if (s->module->seen)
1808 continue;
1809
1810 s->module->seen = 1;
1811 p = strrchr(s->module->name, '/');
1812 if (p)
1813 p++;
1814 else
1815 p = s->module->name;
1816 buf_printf(b, "%s%s", first ? "" : ",", p);
1817 first = 0;
1818 }
1819 buf_printf(b, "\";\n");
1820}
1821
1822static void add_srcversion(struct buffer *b, struct module *mod)
1823{
1824 if (mod->srcversion[0]) {
1825 buf_printf(b, "\n");
1826 buf_printf(b, "MODULE_INFO(srcversion, \"%s\");\n",
1827 mod->srcversion);
1828 }
1829}
1830
1831static void write_if_changed(struct buffer *b, const char *fname)
1832{
1833 char *tmp;
1834 FILE *file;
1835 struct stat st;
1836
1837 file = fopen(fname, "r");
1838 if (!file)
1839 goto write;
1840
1841 if (fstat(fileno(file), &st) < 0)
1842 goto close_write;
1843
1844 if (st.st_size != b->pos)
1845 goto close_write;
1846
1847 tmp = NOFAIL(malloc(b->pos));
1848 if (fread(tmp, 1, b->pos, file) != b->pos)
1849 goto free_write;
1850
1851 if (memcmp(tmp, b->p, b->pos) != 0)
1852 goto free_write;
1853
1854 free(tmp);
1855 fclose(file);
1856 return;
1857
1858 free_write:
1859 free(tmp);
1860 close_write:
1861 fclose(file);
1862 write:
1863 file = fopen(fname, "w");
1864 if (!file) {
1865 perror(fname);
1866 exit(1);
1867 }
1868 if (fwrite(b->p, 1, b->pos, file) != b->pos) {
1869 perror(fname);
1870 exit(1);
1871 }
1872 fclose(file);
1873}
1874
1875
1876
1877
1878static void read_dump(const char *fname, unsigned int kernel)
1879{
1880 unsigned long size, pos = 0;
1881 void *file = grab_file(fname, &size);
1882 char *line;
1883
1884 if (!file)
1885
1886 return;
1887
1888 while ((line = get_next_line(&pos, file, size))) {
1889 char *symname, *modname, *d, *export, *end;
1890 unsigned int crc;
1891 struct module *mod;
1892 struct symbol *s;
1893
1894 if (!(symname = strchr(line, '\t')))
1895 goto fail;
1896 *symname++ = '\0';
1897 if (!(modname = strchr(symname, '\t')))
1898 goto fail;
1899 *modname++ = '\0';
1900 if ((export = strchr(modname, '\t')) != NULL)
1901 *export++ = '\0';
1902 if (export && ((end = strchr(export, '\t')) != NULL))
1903 *end = '\0';
1904 crc = strtoul(line, &d, 16);
1905 if (*symname == '\0' || *modname == '\0' || *d != '\0')
1906 goto fail;
1907 mod = find_module(modname);
1908 if (!mod) {
1909 if (is_vmlinux(modname))
1910 have_vmlinux = 1;
1911 mod = new_module(modname);
1912 mod->skip = 1;
1913 }
1914 s = sym_add_exported(symname, mod, export_no(export));
1915 s->kernel = kernel;
1916 s->preloaded = 1;
1917 sym_update_crc(symname, mod, crc, export_no(export));
1918 }
1919 return;
1920fail:
1921 fatal("parse error in symbol dump file\n");
1922}
1923
1924
1925
1926
1927
1928static int dump_sym(struct symbol *sym)
1929{
1930 if (!external_module)
1931 return 1;
1932 if (sym->vmlinux || sym->kernel)
1933 return 0;
1934 return 1;
1935}
1936
1937static void write_dump(const char *fname)
1938{
1939 struct buffer buf = { };
1940 struct symbol *symbol;
1941 int n;
1942
1943 for (n = 0; n < SYMBOL_HASH_SIZE ; n++) {
1944 symbol = symbolhash[n];
1945 while (symbol) {
1946 if (dump_sym(symbol))
1947 buf_printf(&buf, "0x%08x\t%s\t%s\t%s\n",
1948 symbol->crc, symbol->name,
1949 symbol->module->name,
1950 export_str(symbol->export));
1951 symbol = symbol->next;
1952 }
1953 }
1954 write_if_changed(&buf, fname);
1955}
1956
1957struct ext_sym_list {
1958 struct ext_sym_list *next;
1959 const char *file;
1960};
1961
1962int main(int argc, char **argv)
1963{
1964 struct module *mod;
1965 struct buffer buf = { };
1966 char *kernel_read = NULL, *module_read = NULL;
1967 char *dump_write = NULL;
1968 int opt;
1969 int err;
1970 struct ext_sym_list *extsym_iter;
1971 struct ext_sym_list *extsym_start = NULL;
1972
1973 while ((opt = getopt(argc, argv, "i:I:e:cmsSo:awM:K:")) != -1) {
1974 switch (opt) {
1975 case 'i':
1976 kernel_read = optarg;
1977 break;
1978 case 'I':
1979 module_read = optarg;
1980 external_module = 1;
1981 break;
1982 case 'c':
1983 cross_build = 1;
1984 break;
1985 case 'e':
1986 external_module = 1;
1987 extsym_iter =
1988 NOFAIL(malloc(sizeof(*extsym_iter)));
1989 extsym_iter->next = extsym_start;
1990 extsym_iter->file = optarg;
1991 extsym_start = extsym_iter;
1992 break;
1993 case 'm':
1994 modversions = 1;
1995 break;
1996 case 'o':
1997 dump_write = optarg;
1998 break;
1999 case 'a':
2000 all_versions = 1;
2001 break;
2002 case 's':
2003 vmlinux_section_warnings = 0;
2004 break;
2005 case 'S':
2006 sec_mismatch_verbose = 0;
2007 break;
2008 case 'w':
2009 warn_unresolved = 1;
2010 break;
2011 default:
2012 exit(1);
2013 }
2014 }
2015
2016 if (kernel_read)
2017 read_dump(kernel_read, 1);
2018 if (module_read)
2019 read_dump(module_read, 0);
2020 while (extsym_start) {
2021 read_dump(extsym_start->file, 0);
2022 extsym_iter = extsym_start->next;
2023 free(extsym_start);
2024 extsym_start = extsym_iter;
2025 }
2026
2027 while (optind < argc)
2028 read_symbols(argv[optind++]);
2029
2030 for (mod = modules; mod; mod = mod->next) {
2031 if (mod->skip)
2032 continue;
2033 check_exports(mod);
2034 }
2035
2036 err = 0;
2037
2038 for (mod = modules; mod; mod = mod->next) {
2039 char fname[strlen(mod->name) + 10];
2040
2041 if (mod->skip)
2042 continue;
2043
2044 buf.pos = 0;
2045
2046 add_header(&buf, mod);
2047 add_staging_flag(&buf, mod->name);
2048 err |= add_versions(&buf, mod);
2049 add_depends(&buf, mod, modules);
2050 add_moddevtable(&buf, mod);
2051 add_srcversion(&buf, mod);
2052
2053 sprintf(fname, "%s.mod.c", mod->name);
2054 write_if_changed(&buf, fname);
2055 }
2056
2057 if (dump_write)
2058 write_dump(dump_write);
2059 if (sec_mismatch_count && !sec_mismatch_verbose)
2060 warn("modpost: Found %d section mismatch(es).\n"
2061 "To see full details build your kernel with:\n"
2062 "'make CONFIG_DEBUG_SECTION_MISMATCH=y'\n",
2063 sec_mismatch_count);
2064
2065 return err;
2066}
2067