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