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
694int 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.data$", ".devinit.data$", ".cpuinit.data$", ".meminit.data$"
767#define ALL_EXIT_DATA_SECTIONS \
768 ".exit.data$", ".devexit.data$", ".cpuexit.data$", ".memexit.data$"
769
770#define ALL_INIT_TEXT_SECTIONS \
771 ".init.text$", ".devinit.text$", ".cpuinit.text$", ".meminit.text$"
772#define ALL_EXIT_TEXT_SECTIONS \
773 ".exit.text$", ".devexit.text$", ".cpuexit.text$", ".memexit.text$"
774
775#define ALL_INIT_SECTIONS ALL_INIT_DATA_SECTIONS, ALL_INIT_TEXT_SECTIONS
776#define ALL_EXIT_SECTIONS ALL_EXIT_DATA_SECTIONS, ALL_EXIT_TEXT_SECTIONS
777
778#define DATA_SECTIONS ".data$", ".data.rel$"
779#define TEXT_SECTIONS ".text$"
780
781#define INIT_SECTIONS ".init.data$", ".init.text$"
782#define DEV_INIT_SECTIONS ".devinit.data$", ".devinit.text$"
783#define CPU_INIT_SECTIONS ".cpuinit.data$", ".cpuinit.text$"
784#define MEM_INIT_SECTIONS ".meminit.data$", ".meminit.text$"
785
786#define EXIT_SECTIONS ".exit.data$", ".exit.text$"
787#define DEV_EXIT_SECTIONS ".devexit.data$", ".devexit.text$"
788#define CPU_EXIT_SECTIONS ".cpuexit.data$", ".cpuexit.text$"
789#define MEM_EXIT_SECTIONS ".memexit.data$", ".memexit.text$"
790
791
792static const char *init_data_sections[] = { ALL_INIT_DATA_SECTIONS, NULL };
793
794
795static const char *init_sections[] = { ALL_INIT_SECTIONS, NULL };
796
797
798static const char *init_exit_sections[] =
799 {ALL_INIT_SECTIONS, ALL_EXIT_SECTIONS, NULL };
800
801
802static const char *data_sections[] = { DATA_SECTIONS, NULL };
803
804
805
806static const char *symbol_white_list[] =
807{
808 "*driver",
809 "*_template",
810 "*_timer",
811 "*_sht",
812 "*_ops",
813 "*_probe",
814 "*_probe_one",
815 "*_console",
816 NULL
817};
818
819static const char *head_sections[] = { ".head.text*", NULL };
820static const char *linker_symbols[] =
821 { "__init_begin", "_sinittext", "_einittext", NULL };
822
823enum mismatch {
824 NO_MISMATCH,
825 TEXT_TO_INIT,
826 DATA_TO_INIT,
827 TEXT_TO_EXIT,
828 DATA_TO_EXIT,
829 XXXINIT_TO_INIT,
830 XXXEXIT_TO_EXIT,
831 INIT_TO_EXIT,
832 EXIT_TO_INIT,
833 EXPORT_TO_INIT_EXIT,
834};
835
836struct sectioncheck {
837 const char *fromsec[20];
838 const char *tosec[20];
839 enum mismatch mismatch;
840};
841
842const struct sectioncheck sectioncheck[] = {
843
844
845
846{
847 .fromsec = { TEXT_SECTIONS, NULL },
848 .tosec = { ALL_INIT_SECTIONS, NULL },
849 .mismatch = TEXT_TO_INIT,
850},
851{
852 .fromsec = { DATA_SECTIONS, NULL },
853 .tosec = { ALL_INIT_SECTIONS, NULL },
854 .mismatch = DATA_TO_INIT,
855},
856{
857 .fromsec = { TEXT_SECTIONS, NULL },
858 .tosec = { ALL_EXIT_SECTIONS, NULL },
859 .mismatch = TEXT_TO_EXIT,
860},
861{
862 .fromsec = { DATA_SECTIONS, NULL },
863 .tosec = { ALL_EXIT_SECTIONS, NULL },
864 .mismatch = DATA_TO_EXIT,
865},
866
867{
868 .fromsec = { DEV_INIT_SECTIONS, CPU_INIT_SECTIONS, MEM_INIT_SECTIONS, NULL },
869 .tosec = { INIT_SECTIONS, NULL },
870 .mismatch = XXXINIT_TO_INIT,
871},
872
873{
874 .fromsec = { DEV_EXIT_SECTIONS, CPU_EXIT_SECTIONS, MEM_EXIT_SECTIONS, NULL },
875 .tosec = { EXIT_SECTIONS, NULL },
876 .mismatch = XXXEXIT_TO_EXIT,
877},
878
879{
880 .fromsec = { ALL_INIT_SECTIONS, NULL },
881 .tosec = { ALL_EXIT_SECTIONS, NULL },
882 .mismatch = INIT_TO_EXIT,
883},
884
885{
886 .fromsec = { ALL_EXIT_SECTIONS, NULL },
887 .tosec = { ALL_INIT_SECTIONS, NULL },
888 .mismatch = EXIT_TO_INIT,
889},
890
891{
892 .fromsec = { "__ksymtab*", NULL },
893 .tosec = { INIT_SECTIONS, EXIT_SECTIONS, NULL },
894 .mismatch = EXPORT_TO_INIT_EXIT
895}
896};
897
898static int section_mismatch(const char *fromsec, const char *tosec)
899{
900 int i;
901 int elems = sizeof(sectioncheck) / sizeof(struct sectioncheck);
902 const struct sectioncheck *check = §ioncheck[0];
903
904 for (i = 0; i < elems; i++) {
905 if (match(fromsec, check->fromsec) &&
906 match(tosec, check->tosec))
907 return check->mismatch;
908 check++;
909 }
910 return NO_MISMATCH;
911}
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950static int secref_whitelist(const char *fromsec, const char *fromsym,
951 const char *tosec, const char *tosym)
952{
953
954 if (match(tosec, init_data_sections) &&
955 match(fromsec, data_sections) &&
956 (strncmp(fromsym, "__param", strlen("__param")) == 0))
957 return 0;
958
959
960 if (match(tosec, init_exit_sections) &&
961 match(fromsec, data_sections) &&
962 match(fromsym, symbol_white_list))
963 return 0;
964
965
966 if (match(fromsec, head_sections) &&
967 match(tosec, init_sections))
968 return 0;
969
970
971 if (match(tosym, linker_symbols))
972 return 0;
973
974 return 1;
975}
976
977
978
979
980
981
982
983
984static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr,
985 Elf_Sym *relsym)
986{
987 Elf_Sym *sym;
988 Elf_Sym *near = NULL;
989 Elf64_Sword distance = 20;
990 Elf64_Sword d;
991
992 if (relsym->st_name != 0)
993 return relsym;
994 for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
995 if (sym->st_shndx != relsym->st_shndx)
996 continue;
997 if (ELF_ST_TYPE(sym->st_info) == STT_SECTION)
998 continue;
999 if (sym->st_value == addr)
1000 return sym;
1001
1002 d = sym->st_value - addr;
1003 if (d < 0)
1004 d = addr - sym->st_value;
1005 if (d < distance) {
1006 distance = d;
1007 near = sym;
1008 }
1009 }
1010
1011 if (distance < 20)
1012 return near;
1013 else
1014 return NULL;
1015}
1016
1017static inline int is_arm_mapping_symbol(const char *str)
1018{
1019 return str[0] == '$' && strchr("atd", str[1])
1020 && (str[2] == '\0' || str[2] == '.');
1021}
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym)
1033{
1034 const char *name = elf->strtab + sym->st_name;
1035
1036 if (!name || !strlen(name))
1037 return 0;
1038 return !is_arm_mapping_symbol(name);
1039}
1040
1041
1042
1043
1044
1045
1046
1047static Elf_Sym *find_elf_symbol2(struct elf_info *elf, Elf_Addr addr,
1048 const char *sec)
1049{
1050 Elf_Sym *sym;
1051 Elf_Sym *near = NULL;
1052 Elf_Addr distance = ~0;
1053
1054 for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
1055 const char *symsec;
1056
1057 if (sym->st_shndx >= SHN_LORESERVE)
1058 continue;
1059 symsec = sec_name(elf, sym->st_shndx);
1060 if (strcmp(symsec, sec) != 0)
1061 continue;
1062 if (!is_valid_name(elf, sym))
1063 continue;
1064 if (sym->st_value <= addr) {
1065 if ((addr - sym->st_value) < distance) {
1066 distance = addr - sym->st_value;
1067 near = sym;
1068 } else if ((addr - sym->st_value) == distance) {
1069 near = sym;
1070 }
1071 }
1072 }
1073 return near;
1074}
1075
1076
1077
1078
1079
1080
1081
1082
1083static char *sec2annotation(const char *s)
1084{
1085 if (match(s, init_exit_sections)) {
1086 char *p = malloc(20);
1087 char *r = p;
1088
1089 *p++ = '_';
1090 *p++ = '_';
1091 if (*s == '.')
1092 s++;
1093 while (*s && *s != '.')
1094 *p++ = *s++;
1095 *p = '\0';
1096 if (*s == '.')
1097 s++;
1098 if (strstr(s, "rodata") != NULL)
1099 strcat(p, "const ");
1100 else if (strstr(s, "data") != NULL)
1101 strcat(p, "data ");
1102 else
1103 strcat(p, " ");
1104 return r;
1105 } else {
1106 return "";
1107 }
1108}
1109
1110static int is_function(Elf_Sym *sym)
1111{
1112 if (sym)
1113 return ELF_ST_TYPE(sym->st_info) == STT_FUNC;
1114 else
1115 return -1;
1116}
1117
1118
1119
1120
1121
1122
1123static void report_sec_mismatch(const char *modname, enum mismatch mismatch,
1124 const char *fromsec,
1125 unsigned long long fromaddr,
1126 const char *fromsym,
1127 int from_is_func,
1128 const char *tosec, const char *tosym,
1129 int to_is_func)
1130{
1131 const char *from, *from_p;
1132 const char *to, *to_p;
1133
1134 switch (from_is_func) {
1135 case 0: from = "variable"; from_p = ""; break;
1136 case 1: from = "function"; from_p = "()"; break;
1137 default: from = "(unknown reference)"; from_p = ""; break;
1138 }
1139 switch (to_is_func) {
1140 case 0: to = "variable"; to_p = ""; break;
1141 case 1: to = "function"; to_p = "()"; break;
1142 default: to = "(unknown reference)"; to_p = ""; break;
1143 }
1144
1145 sec_mismatch_count++;
1146 if (!sec_mismatch_verbose)
1147 return;
1148
1149 warn("%s(%s+0x%llx): Section mismatch in reference from the %s %s%s "
1150 "to the %s %s:%s%s\n",
1151 modname, fromsec, fromaddr, from, fromsym, from_p, to, tosec,
1152 tosym, to_p);
1153
1154 switch (mismatch) {
1155 case TEXT_TO_INIT:
1156 fprintf(stderr,
1157 "The function %s%s() references\n"
1158 "the %s %s%s%s.\n"
1159 "This is often because %s lacks a %s\n"
1160 "annotation or the annotation of %s is wrong.\n",
1161 sec2annotation(fromsec), fromsym,
1162 to, sec2annotation(tosec), tosym, to_p,
1163 fromsym, sec2annotation(tosec), tosym);
1164 break;
1165 case DATA_TO_INIT: {
1166 const char **s = symbol_white_list;
1167 fprintf(stderr,
1168 "The variable %s references\n"
1169 "the %s %s%s%s\n"
1170 "If the reference is valid then annotate the\n"
1171 "variable with __init* (see linux/init.h) "
1172 "or name the variable:\n",
1173 fromsym, to, sec2annotation(tosec), tosym, to_p);
1174 while (*s)
1175 fprintf(stderr, "%s, ", *s++);
1176 fprintf(stderr, "\n");
1177 break;
1178 }
1179 case TEXT_TO_EXIT:
1180 fprintf(stderr,
1181 "The function %s() references a %s in an exit section.\n"
1182 "Often the %s %s%s has valid usage outside the exit section\n"
1183 "and the fix is to remove the %sannotation of %s.\n",
1184 fromsym, to, to, tosym, to_p, sec2annotation(tosec), tosym);
1185 break;
1186 case DATA_TO_EXIT: {
1187 const char **s = symbol_white_list;
1188 fprintf(stderr,
1189 "The variable %s references\n"
1190 "the %s %s%s%s\n"
1191 "If the reference is valid then annotate the\n"
1192 "variable with __exit* (see linux/init.h) or "
1193 "name the variable:\n",
1194 fromsym, to, sec2annotation(tosec), tosym, to_p);
1195 while (*s)
1196 fprintf(stderr, "%s, ", *s++);
1197 fprintf(stderr, "\n");
1198 break;
1199 }
1200 case XXXINIT_TO_INIT:
1201 case XXXEXIT_TO_EXIT:
1202 fprintf(stderr,
1203 "The %s %s%s%s references\n"
1204 "a %s %s%s%s.\n"
1205 "If %s is only used by %s then\n"
1206 "annotate %s with a matching annotation.\n",
1207 from, sec2annotation(fromsec), fromsym, from_p,
1208 to, sec2annotation(tosec), tosym, to_p,
1209 tosym, fromsym, tosym);
1210 break;
1211 case INIT_TO_EXIT:
1212 fprintf(stderr,
1213 "The %s %s%s%s references\n"
1214 "a %s %s%s%s.\n"
1215 "This is often seen when error handling "
1216 "in the init function\n"
1217 "uses functionality in the exit path.\n"
1218 "The fix is often to remove the %sannotation of\n"
1219 "%s%s so it may be used outside an exit section.\n",
1220 from, sec2annotation(fromsec), fromsym, from_p,
1221 to, sec2annotation(tosec), tosym, to_p,
1222 sec2annotation(tosec), tosym, to_p);
1223 break;
1224 case EXIT_TO_INIT:
1225 fprintf(stderr,
1226 "The %s %s%s%s references\n"
1227 "a %s %s%s%s.\n"
1228 "This is often seen when error handling "
1229 "in the exit function\n"
1230 "uses functionality in the init path.\n"
1231 "The fix is often to remove the %sannotation of\n"
1232 "%s%s so it may be used outside an init section.\n",
1233 from, sec2annotation(fromsec), fromsym, from_p,
1234 to, sec2annotation(tosec), tosym, to_p,
1235 sec2annotation(tosec), tosym, to_p);
1236 break;
1237 case EXPORT_TO_INIT_EXIT:
1238 fprintf(stderr,
1239 "The symbol %s is exported and annotated %s\n"
1240 "Fix this by removing the %sannotation of %s "
1241 "or drop the export.\n",
1242 tosym, sec2annotation(tosec), sec2annotation(tosec), tosym);
1243 case NO_MISMATCH:
1244
1245 break;
1246 }
1247 fprintf(stderr, "\n");
1248}
1249
1250static void check_section_mismatch(const char *modname, struct elf_info *elf,
1251 Elf_Rela *r, Elf_Sym *sym, const char *fromsec)
1252{
1253 const char *tosec;
1254 enum mismatch mismatch;
1255
1256 tosec = sec_name(elf, sym->st_shndx);
1257 mismatch = section_mismatch(fromsec, tosec);
1258 if (mismatch != NO_MISMATCH) {
1259 Elf_Sym *to;
1260 Elf_Sym *from;
1261 const char *tosym;
1262 const char *fromsym;
1263
1264 from = find_elf_symbol2(elf, r->r_offset, fromsec);
1265 fromsym = sym_name(elf, from);
1266 to = find_elf_symbol(elf, r->r_addend, sym);
1267 tosym = sym_name(elf, to);
1268
1269
1270 if (secref_whitelist(fromsec, fromsym, tosec, tosym)) {
1271 report_sec_mismatch(modname, mismatch,
1272 fromsec, r->r_offset, fromsym,
1273 is_function(from), tosec, tosym,
1274 is_function(to));
1275 }
1276 }
1277}
1278
1279static unsigned int *reloc_location(struct elf_info *elf,
1280 Elf_Shdr *sechdr, Elf_Rela *r)
1281{
1282 Elf_Shdr *sechdrs = elf->sechdrs;
1283 int section = sechdr->sh_info;
1284
1285 return (void *)elf->hdr + sechdrs[section].sh_offset +
1286 (r->r_offset - sechdrs[section].sh_addr);
1287}
1288
1289static int addend_386_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1290{
1291 unsigned int r_typ = ELF_R_TYPE(r->r_info);
1292 unsigned int *location = reloc_location(elf, sechdr, r);
1293
1294 switch (r_typ) {
1295 case R_386_32:
1296 r->r_addend = TO_NATIVE(*location);
1297 break;
1298 case R_386_PC32:
1299 r->r_addend = TO_NATIVE(*location) + 4;
1300
1301 if (elf->hdr->e_type == ET_EXEC)
1302 r->r_addend += r->r_offset;
1303 break;
1304 }
1305 return 0;
1306}
1307
1308static int addend_arm_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1309{
1310 unsigned int r_typ = ELF_R_TYPE(r->r_info);
1311
1312 switch (r_typ) {
1313 case R_ARM_ABS32:
1314
1315 r->r_addend = (int)(long)
1316 (elf->symtab_start + ELF_R_SYM(r->r_info));
1317 break;
1318 case R_ARM_PC24:
1319
1320 r->r_addend = (int)(long)(elf->hdr +
1321 sechdr->sh_offset +
1322 (r->r_offset - sechdr->sh_addr));
1323 break;
1324 default:
1325 return 1;
1326 }
1327 return 0;
1328}
1329
1330static int addend_mips_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1331{
1332 unsigned int r_typ = ELF_R_TYPE(r->r_info);
1333 unsigned int *location = reloc_location(elf, sechdr, r);
1334 unsigned int inst;
1335
1336 if (r_typ == R_MIPS_HI16)
1337 return 1;
1338 inst = TO_NATIVE(*location);
1339 switch (r_typ) {
1340 case R_MIPS_LO16:
1341 r->r_addend = inst & 0xffff;
1342 break;
1343 case R_MIPS_26:
1344 r->r_addend = (inst & 0x03ffffff) << 2;
1345 break;
1346 case R_MIPS_32:
1347 r->r_addend = inst;
1348 break;
1349 }
1350 return 0;
1351}
1352
1353static void section_rela(const char *modname, struct elf_info *elf,
1354 Elf_Shdr *sechdr)
1355{
1356 Elf_Sym *sym;
1357 Elf_Rela *rela;
1358 Elf_Rela r;
1359 unsigned int r_sym;
1360 const char *fromsec;
1361
1362 Elf_Rela *start = (void *)elf->hdr + sechdr->sh_offset;
1363 Elf_Rela *stop = (void *)start + sechdr->sh_size;
1364
1365 fromsec = sech_name(elf, sechdr);
1366 fromsec += strlen(".rela");
1367
1368 if (match(fromsec, section_white_list))
1369 return;
1370
1371 for (rela = start; rela < stop; rela++) {
1372 r.r_offset = TO_NATIVE(rela->r_offset);
1373#if KERNEL_ELFCLASS == ELFCLASS64
1374 if (elf->hdr->e_machine == EM_MIPS) {
1375 unsigned int r_typ;
1376 r_sym = ELF64_MIPS_R_SYM(rela->r_info);
1377 r_sym = TO_NATIVE(r_sym);
1378 r_typ = ELF64_MIPS_R_TYPE(rela->r_info);
1379 r.r_info = ELF64_R_INFO(r_sym, r_typ);
1380 } else {
1381 r.r_info = TO_NATIVE(rela->r_info);
1382 r_sym = ELF_R_SYM(r.r_info);
1383 }
1384#else
1385 r.r_info = TO_NATIVE(rela->r_info);
1386 r_sym = ELF_R_SYM(r.r_info);
1387#endif
1388 r.r_addend = TO_NATIVE(rela->r_addend);
1389 sym = elf->symtab_start + r_sym;
1390
1391 if (sym->st_shndx >= SHN_LORESERVE)
1392 continue;
1393 check_section_mismatch(modname, elf, &r, sym, fromsec);
1394 }
1395}
1396
1397static void section_rel(const char *modname, struct elf_info *elf,
1398 Elf_Shdr *sechdr)
1399{
1400 Elf_Sym *sym;
1401 Elf_Rel *rel;
1402 Elf_Rela r;
1403 unsigned int r_sym;
1404 const char *fromsec;
1405
1406 Elf_Rel *start = (void *)elf->hdr + sechdr->sh_offset;
1407 Elf_Rel *stop = (void *)start + sechdr->sh_size;
1408
1409 fromsec = sech_name(elf, sechdr);
1410 fromsec += strlen(".rel");
1411
1412 if (match(fromsec, section_white_list))
1413 return;
1414
1415 for (rel = start; rel < stop; rel++) {
1416 r.r_offset = TO_NATIVE(rel->r_offset);
1417#if KERNEL_ELFCLASS == ELFCLASS64
1418 if (elf->hdr->e_machine == EM_MIPS) {
1419 unsigned int r_typ;
1420 r_sym = ELF64_MIPS_R_SYM(rel->r_info);
1421 r_sym = TO_NATIVE(r_sym);
1422 r_typ = ELF64_MIPS_R_TYPE(rel->r_info);
1423 r.r_info = ELF64_R_INFO(r_sym, r_typ);
1424 } else {
1425 r.r_info = TO_NATIVE(rel->r_info);
1426 r_sym = ELF_R_SYM(r.r_info);
1427 }
1428#else
1429 r.r_info = TO_NATIVE(rel->r_info);
1430 r_sym = ELF_R_SYM(r.r_info);
1431#endif
1432 r.r_addend = 0;
1433 switch (elf->hdr->e_machine) {
1434 case EM_386:
1435 if (addend_386_rel(elf, sechdr, &r))
1436 continue;
1437 break;
1438 case EM_ARM:
1439 if (addend_arm_rel(elf, sechdr, &r))
1440 continue;
1441 break;
1442 case EM_MIPS:
1443 if (addend_mips_rel(elf, sechdr, &r))
1444 continue;
1445 break;
1446 }
1447 sym = elf->symtab_start + r_sym;
1448
1449 if (sym->st_shndx >= SHN_LORESERVE)
1450 continue;
1451 check_section_mismatch(modname, elf, &r, sym, fromsec);
1452 }
1453}
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467static void check_sec_ref(struct module *mod, const char *modname,
1468 struct elf_info *elf)
1469{
1470 int i;
1471 Elf_Shdr *sechdrs = elf->sechdrs;
1472
1473
1474 for (i = 0; i < elf->hdr->e_shnum; i++) {
1475 check_section(modname, elf, &elf->sechdrs[i]);
1476
1477 if (sechdrs[i].sh_type == SHT_RELA)
1478 section_rela(modname, elf, &elf->sechdrs[i]);
1479 else if (sechdrs[i].sh_type == SHT_REL)
1480 section_rel(modname, elf, &elf->sechdrs[i]);
1481 }
1482}
1483
1484static void get_markers(struct elf_info *info, struct module *mod)
1485{
1486 const Elf_Shdr *sh = &info->sechdrs[info->markers_strings_sec];
1487 const char *strings = (const char *) info->hdr + sh->sh_offset;
1488 const Elf_Sym *sym, *first_sym, *last_sym;
1489 size_t n;
1490
1491 if (!info->markers_strings_sec)
1492 return;
1493
1494
1495
1496
1497
1498
1499
1500 first_sym = last_sym = NULL;
1501 n = 0;
1502 for (sym = info->symtab_start; sym < info->symtab_stop; sym++)
1503 if (ELF_ST_TYPE(sym->st_info) == STT_OBJECT &&
1504 sym->st_shndx == info->markers_strings_sec &&
1505 !strncmp(info->strtab + sym->st_name,
1506 "__mstrtab_", sizeof "__mstrtab_" - 1)) {
1507 if (first_sym == NULL)
1508 first_sym = sym;
1509 last_sym = sym;
1510 ++n;
1511 }
1512
1513 if (n == 0)
1514 return;
1515
1516
1517
1518
1519
1520
1521
1522 mod->markers = NOFAIL(malloc(sizeof mod->markers[0] * n));
1523 mod->nmarkers = n;
1524
1525 n = 0;
1526 for (sym = first_sym; sym <= last_sym; sym++)
1527 if (ELF_ST_TYPE(sym->st_info) == STT_OBJECT &&
1528 sym->st_shndx == info->markers_strings_sec &&
1529 !strncmp(info->strtab + sym->st_name,
1530 "__mstrtab_", sizeof "__mstrtab_" - 1)) {
1531 const char *name = strings + sym->st_value;
1532 const char *fmt = strchr(name, '\0') + 1;
1533 char *line = NULL;
1534 asprintf(&line, "%s\t%s\t%s\n", name, mod->name, fmt);
1535 NOFAIL(line);
1536 mod->markers[n++] = line;
1537 }
1538}
1539
1540static void read_symbols(char *modname)
1541{
1542 const char *symname;
1543 char *version;
1544 char *license;
1545 struct module *mod;
1546 struct elf_info info = { };
1547 Elf_Sym *sym;
1548
1549 if (!parse_elf(&info, modname))
1550 return;
1551
1552 mod = new_module(modname);
1553
1554
1555
1556 if (is_vmlinux(modname)) {
1557 have_vmlinux = 1;
1558 mod->skip = 1;
1559 }
1560
1561 license = get_modinfo(info.modinfo, info.modinfo_len, "license");
1562 if (info.modinfo && !license && !is_vmlinux(modname))
1563 warn("modpost: missing MODULE_LICENSE() in %s\n"
1564 "see include/linux/module.h for "
1565 "more information\n", modname);
1566 while (license) {
1567 if (license_is_gpl_compatible(license))
1568 mod->gpl_compatible = 1;
1569 else {
1570 mod->gpl_compatible = 0;
1571 break;
1572 }
1573 license = get_next_modinfo(info.modinfo, info.modinfo_len,
1574 "license", license);
1575 }
1576
1577 for (sym = info.symtab_start; sym < info.symtab_stop; sym++) {
1578 symname = info.strtab + sym->st_name;
1579
1580 handle_modversions(mod, &info, sym, symname);
1581 handle_moddevtable(mod, &info, sym, symname);
1582 }
1583 if (!is_vmlinux(modname) ||
1584 (is_vmlinux(modname) && vmlinux_section_warnings))
1585 check_sec_ref(mod, modname, &info);
1586
1587 version = get_modinfo(info.modinfo, info.modinfo_len, "version");
1588 if (version)
1589 maybe_frob_rcs_version(modname, version, info.modinfo,
1590 version - (char *)info.hdr);
1591 if (version || (all_versions && !is_vmlinux(modname)))
1592 get_src_version(modname, mod->srcversion,
1593 sizeof(mod->srcversion)-1);
1594
1595 get_markers(&info, mod);
1596
1597 parse_elf_finish(&info);
1598
1599
1600
1601
1602
1603 if (modversions)
1604 mod->unres = alloc_symbol("module_layout", 0, mod->unres);
1605}
1606
1607#define SZ 500
1608
1609
1610
1611
1612
1613void __attribute__((format(printf, 2, 3))) buf_printf(struct buffer *buf,
1614 const char *fmt, ...)
1615{
1616 char tmp[SZ];
1617 int len;
1618 va_list ap;
1619
1620 va_start(ap, fmt);
1621 len = vsnprintf(tmp, SZ, fmt, ap);
1622 buf_write(buf, tmp, len);
1623 va_end(ap);
1624}
1625
1626void buf_write(struct buffer *buf, const char *s, int len)
1627{
1628 if (buf->size - buf->pos < len) {
1629 buf->size += len + SZ;
1630 buf->p = realloc(buf->p, buf->size);
1631 }
1632 strncpy(buf->p + buf->pos, s, len);
1633 buf->pos += len;
1634}
1635
1636static void check_for_gpl_usage(enum export exp, const char *m, const char *s)
1637{
1638 const char *e = is_vmlinux(m) ?"":".ko";
1639
1640 switch (exp) {
1641 case export_gpl:
1642 fatal("modpost: GPL-incompatible module %s%s "
1643 "uses GPL-only symbol '%s'\n", m, e, s);
1644 break;
1645 case export_unused_gpl:
1646 fatal("modpost: GPL-incompatible module %s%s "
1647 "uses GPL-only symbol marked UNUSED '%s'\n", m, e, s);
1648 break;
1649 case export_gpl_future:
1650 warn("modpost: GPL-incompatible module %s%s "
1651 "uses future GPL-only symbol '%s'\n", m, e, s);
1652 break;
1653 case export_plain:
1654 case export_unused:
1655 case export_unknown:
1656
1657 break;
1658 }
1659}
1660
1661static void check_for_unused(enum export exp, const char *m, const char *s)
1662{
1663 const char *e = is_vmlinux(m) ?"":".ko";
1664
1665 switch (exp) {
1666 case export_unused:
1667 case export_unused_gpl:
1668 warn("modpost: module %s%s "
1669 "uses symbol '%s' marked UNUSED\n", m, e, s);
1670 break;
1671 default:
1672
1673 break;
1674 }
1675}
1676
1677static void check_exports(struct module *mod)
1678{
1679 struct symbol *s, *exp;
1680
1681 for (s = mod->unres; s; s = s->next) {
1682 const char *basename;
1683 exp = find_symbol(s->name);
1684 if (!exp || exp->module == mod)
1685 continue;
1686 basename = strrchr(mod->name, '/');
1687 if (basename)
1688 basename++;
1689 else
1690 basename = mod->name;
1691 if (!mod->gpl_compatible)
1692 check_for_gpl_usage(exp->export, basename, exp->name);
1693 check_for_unused(exp->export, basename, exp->name);
1694 }
1695}
1696
1697
1698
1699
1700static void add_header(struct buffer *b, struct module *mod)
1701{
1702 buf_printf(b, "#include <linux/module.h>\n");
1703 buf_printf(b, "#include <linux/vermagic.h>\n");
1704 buf_printf(b, "#include <linux/compiler.h>\n");
1705 buf_printf(b, "\n");
1706 buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n");
1707 buf_printf(b, "\n");
1708 buf_printf(b, "struct module __this_module\n");
1709 buf_printf(b, "__attribute__((section(\".gnu.linkonce.this_module\"))) = {\n");
1710 buf_printf(b, " .name = KBUILD_MODNAME,\n");
1711 if (mod->has_init)
1712 buf_printf(b, " .init = init_module,\n");
1713 if (mod->has_cleanup)
1714 buf_printf(b, "#ifdef CONFIG_MODULE_UNLOAD\n"
1715 " .exit = cleanup_module,\n"
1716 "#endif\n");
1717 buf_printf(b, " .arch = MODULE_ARCH_INIT,\n");
1718 buf_printf(b, "};\n");
1719}
1720
1721void add_staging_flag(struct buffer *b, const char *name)
1722{
1723 static const char *staging_dir = "drivers/staging";
1724
1725 if (strncmp(staging_dir, name, strlen(staging_dir)) == 0)
1726 buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n");
1727}
1728
1729
1730
1731
1732static int add_versions(struct buffer *b, struct module *mod)
1733{
1734 struct symbol *s, *exp;
1735 int err = 0;
1736
1737 for (s = mod->unres; s; s = s->next) {
1738 exp = find_symbol(s->name);
1739 if (!exp || exp->module == mod) {
1740 if (have_vmlinux && !s->weak) {
1741 if (warn_unresolved) {
1742 warn("\"%s\" [%s.ko] undefined!\n",
1743 s->name, mod->name);
1744 } else {
1745 merror("\"%s\" [%s.ko] undefined!\n",
1746 s->name, mod->name);
1747 err = 1;
1748 }
1749 }
1750 continue;
1751 }
1752 s->module = exp->module;
1753 s->crc_valid = exp->crc_valid;
1754 s->crc = exp->crc;
1755 }
1756
1757 if (!modversions)
1758 return err;
1759
1760 buf_printf(b, "\n");
1761 buf_printf(b, "static const struct modversion_info ____versions[]\n");
1762 buf_printf(b, "__used\n");
1763 buf_printf(b, "__attribute__((section(\"__versions\"))) = {\n");
1764
1765 for (s = mod->unres; s; s = s->next) {
1766 if (!s->module)
1767 continue;
1768 if (!s->crc_valid) {
1769 warn("\"%s\" [%s.ko] has no CRC!\n",
1770 s->name, mod->name);
1771 continue;
1772 }
1773 buf_printf(b, "\t{ %#8x, \"%s\" },\n", s->crc, s->name);
1774 }
1775
1776 buf_printf(b, "};\n");
1777
1778 return err;
1779}
1780
1781static void add_depends(struct buffer *b, struct module *mod,
1782 struct module *modules)
1783{
1784 struct symbol *s;
1785 struct module *m;
1786 int first = 1;
1787
1788 for (m = modules; m; m = m->next)
1789 m->seen = is_vmlinux(m->name);
1790
1791 buf_printf(b, "\n");
1792 buf_printf(b, "static const char __module_depends[]\n");
1793 buf_printf(b, "__used\n");
1794 buf_printf(b, "__attribute__((section(\".modinfo\"))) =\n");
1795 buf_printf(b, "\"depends=");
1796 for (s = mod->unres; s; s = s->next) {
1797 const char *p;
1798 if (!s->module)
1799 continue;
1800
1801 if (s->module->seen)
1802 continue;
1803
1804 s->module->seen = 1;
1805 p = strrchr(s->module->name, '/');
1806 if (p)
1807 p++;
1808 else
1809 p = s->module->name;
1810 buf_printf(b, "%s%s", first ? "" : ",", p);
1811 first = 0;
1812 }
1813 buf_printf(b, "\";\n");
1814}
1815
1816static void add_srcversion(struct buffer *b, struct module *mod)
1817{
1818 if (mod->srcversion[0]) {
1819 buf_printf(b, "\n");
1820 buf_printf(b, "MODULE_INFO(srcversion, \"%s\");\n",
1821 mod->srcversion);
1822 }
1823}
1824
1825static void write_if_changed(struct buffer *b, const char *fname)
1826{
1827 char *tmp;
1828 FILE *file;
1829 struct stat st;
1830
1831 file = fopen(fname, "r");
1832 if (!file)
1833 goto write;
1834
1835 if (fstat(fileno(file), &st) < 0)
1836 goto close_write;
1837
1838 if (st.st_size != b->pos)
1839 goto close_write;
1840
1841 tmp = NOFAIL(malloc(b->pos));
1842 if (fread(tmp, 1, b->pos, file) != b->pos)
1843 goto free_write;
1844
1845 if (memcmp(tmp, b->p, b->pos) != 0)
1846 goto free_write;
1847
1848 free(tmp);
1849 fclose(file);
1850 return;
1851
1852 free_write:
1853 free(tmp);
1854 close_write:
1855 fclose(file);
1856 write:
1857 file = fopen(fname, "w");
1858 if (!file) {
1859 perror(fname);
1860 exit(1);
1861 }
1862 if (fwrite(b->p, 1, b->pos, file) != b->pos) {
1863 perror(fname);
1864 exit(1);
1865 }
1866 fclose(file);
1867}
1868
1869
1870
1871
1872static void read_dump(const char *fname, unsigned int kernel)
1873{
1874 unsigned long size, pos = 0;
1875 void *file = grab_file(fname, &size);
1876 char *line;
1877
1878 if (!file)
1879
1880 return;
1881
1882 while ((line = get_next_line(&pos, file, size))) {
1883 char *symname, *modname, *d, *export, *end;
1884 unsigned int crc;
1885 struct module *mod;
1886 struct symbol *s;
1887
1888 if (!(symname = strchr(line, '\t')))
1889 goto fail;
1890 *symname++ = '\0';
1891 if (!(modname = strchr(symname, '\t')))
1892 goto fail;
1893 *modname++ = '\0';
1894 if ((export = strchr(modname, '\t')) != NULL)
1895 *export++ = '\0';
1896 if (export && ((end = strchr(export, '\t')) != NULL))
1897 *end = '\0';
1898 crc = strtoul(line, &d, 16);
1899 if (*symname == '\0' || *modname == '\0' || *d != '\0')
1900 goto fail;
1901 mod = find_module(modname);
1902 if (!mod) {
1903 if (is_vmlinux(modname))
1904 have_vmlinux = 1;
1905 mod = new_module(modname);
1906 mod->skip = 1;
1907 }
1908 s = sym_add_exported(symname, mod, export_no(export));
1909 s->kernel = kernel;
1910 s->preloaded = 1;
1911 sym_update_crc(symname, mod, crc, export_no(export));
1912 }
1913 return;
1914fail:
1915 fatal("parse error in symbol dump file\n");
1916}
1917
1918
1919
1920
1921
1922static int dump_sym(struct symbol *sym)
1923{
1924 if (!external_module)
1925 return 1;
1926 if (sym->vmlinux || sym->kernel)
1927 return 0;
1928 return 1;
1929}
1930
1931static void write_dump(const char *fname)
1932{
1933 struct buffer buf = { };
1934 struct symbol *symbol;
1935 int n;
1936
1937 for (n = 0; n < SYMBOL_HASH_SIZE ; n++) {
1938 symbol = symbolhash[n];
1939 while (symbol) {
1940 if (dump_sym(symbol))
1941 buf_printf(&buf, "0x%08x\t%s\t%s\t%s\n",
1942 symbol->crc, symbol->name,
1943 symbol->module->name,
1944 export_str(symbol->export));
1945 symbol = symbol->next;
1946 }
1947 }
1948 write_if_changed(&buf, fname);
1949}
1950
1951static void add_marker(struct module *mod, const char *name, const char *fmt)
1952{
1953 char *line = NULL;
1954 asprintf(&line, "%s\t%s\t%s\n", name, mod->name, fmt);
1955 NOFAIL(line);
1956
1957 mod->markers = NOFAIL(realloc(mod->markers, ((mod->nmarkers + 1) *
1958 sizeof mod->markers[0])));
1959 mod->markers[mod->nmarkers++] = line;
1960}
1961
1962static void read_markers(const char *fname)
1963{
1964 unsigned long size, pos = 0;
1965 void *file = grab_file(fname, &size);
1966 char *line;
1967
1968 if (!file)
1969 return;
1970
1971 while ((line = get_next_line(&pos, file, size))) {
1972 char *marker, *modname, *fmt;
1973 struct module *mod;
1974
1975 marker = line;
1976 modname = strchr(marker, '\t');
1977 if (!modname)
1978 goto fail;
1979 *modname++ = '\0';
1980 fmt = strchr(modname, '\t');
1981 if (!fmt)
1982 goto fail;
1983 *fmt++ = '\0';
1984 if (*marker == '\0' || *modname == '\0')
1985 goto fail;
1986
1987 mod = find_module(modname);
1988 if (!mod) {
1989 mod = new_module(modname);
1990 mod->skip = 1;
1991 }
1992 if (is_vmlinux(modname)) {
1993 have_vmlinux = 1;
1994 mod->skip = 0;
1995 }
1996
1997 if (!mod->skip)
1998 add_marker(mod, marker, fmt);
1999 }
2000 release_file(file, size);
2001 return;
2002fail:
2003 fatal("parse error in markers list file\n");
2004}
2005
2006static int compare_strings(const void *a, const void *b)
2007{
2008 return strcmp(*(const char **) a, *(const char **) b);
2009}
2010
2011static void write_markers(const char *fname)
2012{
2013 struct buffer buf = { };
2014 struct module *mod;
2015 size_t i;
2016
2017 for (mod = modules; mod; mod = mod->next)
2018 if ((!external_module || !mod->skip) && mod->markers != NULL) {
2019
2020
2021
2022
2023 qsort(mod->markers, mod->nmarkers,
2024 sizeof mod->markers[0], &compare_strings);
2025 for (i = 0; i < mod->nmarkers; ++i) {
2026 char *line = mod->markers[i];
2027 buf_write(&buf, line, strlen(line));
2028 while (i + 1 < mod->nmarkers &&
2029 !strcmp(mod->markers[i],
2030 mod->markers[i + 1]))
2031 free(mod->markers[i++]);
2032 free(mod->markers[i]);
2033 }
2034 free(mod->markers);
2035 mod->markers = NULL;
2036 }
2037
2038 write_if_changed(&buf, fname);
2039}
2040
2041struct ext_sym_list {
2042 struct ext_sym_list *next;
2043 const char *file;
2044};
2045
2046int main(int argc, char **argv)
2047{
2048 struct module *mod;
2049 struct buffer buf = { };
2050 char *kernel_read = NULL, *module_read = NULL;
2051 char *dump_write = NULL;
2052 char *markers_read = NULL;
2053 char *markers_write = NULL;
2054 int opt;
2055 int err;
2056 struct ext_sym_list *extsym_iter;
2057 struct ext_sym_list *extsym_start = NULL;
2058
2059 while ((opt = getopt(argc, argv, "i:I:e:cmsSo:awM:K:")) != -1) {
2060 switch (opt) {
2061 case 'i':
2062 kernel_read = optarg;
2063 break;
2064 case 'I':
2065 module_read = optarg;
2066 external_module = 1;
2067 break;
2068 case 'c':
2069 cross_build = 1;
2070 break;
2071 case 'e':
2072 external_module = 1;
2073 extsym_iter =
2074 NOFAIL(malloc(sizeof(*extsym_iter)));
2075 extsym_iter->next = extsym_start;
2076 extsym_iter->file = optarg;
2077 extsym_start = extsym_iter;
2078 break;
2079 case 'm':
2080 modversions = 1;
2081 break;
2082 case 'o':
2083 dump_write = optarg;
2084 break;
2085 case 'a':
2086 all_versions = 1;
2087 break;
2088 case 's':
2089 vmlinux_section_warnings = 0;
2090 break;
2091 case 'S':
2092 sec_mismatch_verbose = 0;
2093 break;
2094 case 'w':
2095 warn_unresolved = 1;
2096 break;
2097 case 'M':
2098 markers_write = optarg;
2099 break;
2100 case 'K':
2101 markers_read = optarg;
2102 break;
2103 default:
2104 exit(1);
2105 }
2106 }
2107
2108 if (kernel_read)
2109 read_dump(kernel_read, 1);
2110 if (module_read)
2111 read_dump(module_read, 0);
2112 while (extsym_start) {
2113 read_dump(extsym_start->file, 0);
2114 extsym_iter = extsym_start->next;
2115 free(extsym_start);
2116 extsym_start = extsym_iter;
2117 }
2118
2119 while (optind < argc)
2120 read_symbols(argv[optind++]);
2121
2122 for (mod = modules; mod; mod = mod->next) {
2123 if (mod->skip)
2124 continue;
2125 check_exports(mod);
2126 }
2127
2128 err = 0;
2129
2130 for (mod = modules; mod; mod = mod->next) {
2131 char fname[strlen(mod->name) + 10];
2132
2133 if (mod->skip)
2134 continue;
2135
2136 buf.pos = 0;
2137
2138 add_header(&buf, mod);
2139 add_staging_flag(&buf, mod->name);
2140 err |= add_versions(&buf, mod);
2141 add_depends(&buf, mod, modules);
2142 add_moddevtable(&buf, mod);
2143 add_srcversion(&buf, mod);
2144
2145 sprintf(fname, "%s.mod.c", mod->name);
2146 write_if_changed(&buf, fname);
2147 }
2148
2149 if (dump_write)
2150 write_dump(dump_write);
2151 if (sec_mismatch_count && !sec_mismatch_verbose)
2152 warn("modpost: Found %d section mismatch(es).\n"
2153 "To see full details build your kernel with:\n"
2154 "'make CONFIG_DEBUG_SECTION_MISMATCH=y'\n",
2155 sec_mismatch_count);
2156
2157 if (markers_read)
2158 read_markers(markers_read);
2159
2160 if (markers_write)
2161 write_markers(markers_write);
2162
2163 return err;
2164}
2165