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