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