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