1 /* Postprocess module symbol versions
3 * Copyright 2003 Kai Germaschewski
4 * Copyright 2002-2004 Rusty Russell, IBM Corporation
5 * Copyright 2006-2008 Sam Ravnborg
6 * Based in part on module-init-tools/depmod.c,file2alias
8 * This software may be used and distributed according to the terms
9 * of the GNU General Public License, incorporated herein by reference.
11 * Usage: modpost vmlinux module1.o module2.o ...
23 #include "../../include/linux/license.h"
25 /* Are we using CONFIG_MODVERSIONS? */
26 static int modversions = 0;
27 /* Warn about undefined symbols? (do so if we have vmlinux) */
28 static int have_vmlinux = 0;
29 /* Is CONFIG_MODULE_SRCVERSION_ALL set? */
30 static int all_versions = 0;
31 /* If we are modposting external module set to 1 */
32 static int external_module = 0;
33 /* Only warn about unresolved symbols */
34 static int warn_unresolved = 0;
35 /* How a symbol is exported */
36 static int sec_mismatch_count = 0;
37 static int sec_mismatch_fatal = 0;
38 /* ignore missing files */
39 static int ignore_missing_files;
40 /* If set to 1, only warn (instead of error) about missing ns imports */
41 static int allow_missing_ns_imports;
44 export_plain, export_unused, export_gpl,
45 export_unused_gpl, export_gpl_future, export_unknown
48 /* In kernel, this size is defined in linux/module.h;
49 * here we use Elf_Addr instead of long for covering cross-compile
52 #define MODULE_NAME_LEN (64 - sizeof(Elf_Addr))
54 void __attribute__((format(printf, 2, 3)))
55 modpost_log(enum loglevel loglevel, const char *fmt, ...)
61 fprintf(stderr, "WARNING: ");
64 fprintf(stderr, "ERROR: ");
67 fprintf(stderr, "FATAL: ");
69 default: /* invalid loglevel, ignore */
73 fprintf(stderr, "modpost: ");
75 va_start(arglist, fmt);
76 vfprintf(stderr, fmt, arglist);
79 if (loglevel == LOG_FATAL)
83 static inline bool strends(const char *str, const char *postfix)
85 if (strlen(str) < strlen(postfix))
88 return strcmp(str + strlen(str) - strlen(postfix), postfix) == 0;
91 void *do_nofail(void *ptr, const char *expr)
94 fatal("Memory allocation failure: %s.\n", expr);
99 char *read_text_file(const char *filename)
106 fd = open(filename, O_RDONLY);
112 if (fstat(fd, &st) < 0) {
117 buf = NOFAIL(malloc(st.st_size + 1));
124 bytes_read = read(fd, buf, nbytes);
125 if (bytes_read < 0) {
130 nbytes -= bytes_read;
132 buf[st.st_size] = '\0';
139 char *get_line(char **stringp)
141 char *orig = *stringp, *next;
143 /* do not return the unwanted extra line at EOF */
144 if (!orig || *orig == '\0')
147 next = strchr(orig, '\n');
156 /* A list of all modules we processed */
157 static struct module *modules;
159 static struct module *find_module(const char *modname)
163 for (mod = modules; mod; mod = mod->next)
164 if (strcmp(mod->name, modname) == 0)
169 static struct module *new_module(const char *modname)
173 mod = NOFAIL(malloc(sizeof(*mod) + strlen(modname) + 1));
174 memset(mod, 0, sizeof(*mod));
177 strcpy(mod->name, modname);
178 mod->is_vmlinux = (strcmp(modname, "vmlinux") == 0);
179 mod->gpl_compatible = -1;
189 /* A hash of all exported symbols,
190 * struct symbol is also used for lists of unresolved symbols */
192 #define SYMBOL_HASH_SIZE 1024
196 struct module *module;
201 unsigned int is_static:1; /* 1 if symbol is not global */
202 enum export export; /* Type of export */
206 static struct symbol *symbolhash[SYMBOL_HASH_SIZE];
208 /* This is based on the hash agorithm from gdbm, via tdb */
209 static inline unsigned int tdb_hash(const char *name)
211 unsigned value; /* Used to compute the hash value. */
212 unsigned i; /* Used to cycle through random values. */
214 /* Set the initial value from the key size. */
215 for (value = 0x238F13AF * strlen(name), i = 0; name[i]; i++)
216 value = (value + (((unsigned char *)name)[i] << (i*5 % 24)));
218 return (1103515243 * value + 12345);
222 * Allocate a new symbols for use in the hash of exported symbols or
223 * the list of unresolved symbols per module
225 static struct symbol *alloc_symbol(const char *name, unsigned int weak,
228 struct symbol *s = NOFAIL(malloc(sizeof(*s) + strlen(name) + 1));
230 memset(s, 0, sizeof(*s));
231 strcpy(s->name, name);
238 /* For the hash of exported symbols */
239 static struct symbol *new_symbol(const char *name, struct module *module,
244 hash = tdb_hash(name) % SYMBOL_HASH_SIZE;
245 symbolhash[hash] = alloc_symbol(name, 0, symbolhash[hash]);
247 return symbolhash[hash];
250 static struct symbol *find_symbol(const char *name)
254 /* For our purposes, .foo matches foo. PPC64 needs this. */
258 for (s = symbolhash[tdb_hash(name) % SYMBOL_HASH_SIZE]; s; s = s->next) {
259 if (strcmp(s->name, name) == 0)
265 static bool contains_namespace(struct namespace_list *list,
266 const char *namespace)
268 for (; list; list = list->next)
269 if (!strcmp(list->namespace, namespace))
275 static void add_namespace(struct namespace_list **list, const char *namespace)
277 struct namespace_list *ns_entry;
279 if (!contains_namespace(*list, namespace)) {
280 ns_entry = NOFAIL(malloc(sizeof(struct namespace_list) +
281 strlen(namespace) + 1));
282 strcpy(ns_entry->namespace, namespace);
283 ns_entry->next = *list;
288 static bool module_imports_namespace(struct module *module,
289 const char *namespace)
291 return contains_namespace(module->imported_namespaces, namespace);
294 static const struct {
298 { .str = "EXPORT_SYMBOL", .export = export_plain },
299 { .str = "EXPORT_UNUSED_SYMBOL", .export = export_unused },
300 { .str = "EXPORT_SYMBOL_GPL", .export = export_gpl },
301 { .str = "EXPORT_UNUSED_SYMBOL_GPL", .export = export_unused_gpl },
302 { .str = "EXPORT_SYMBOL_GPL_FUTURE", .export = export_gpl_future },
303 { .str = "(unknown)", .export = export_unknown },
307 static const char *export_str(enum export ex)
309 return export_list[ex].str;
312 static enum export export_no(const char *s)
317 return export_unknown;
318 for (i = 0; export_list[i].export != export_unknown; i++) {
319 if (strcmp(export_list[i].str, s) == 0)
320 return export_list[i].export;
322 return export_unknown;
325 static void *sym_get_data_by_offset(const struct elf_info *info,
326 unsigned int secindex, unsigned long offset)
328 Elf_Shdr *sechdr = &info->sechdrs[secindex];
330 if (info->hdr->e_type != ET_REL)
331 offset -= sechdr->sh_addr;
333 return (void *)info->hdr + sechdr->sh_offset + offset;
336 static void *sym_get_data(const struct elf_info *info, const Elf_Sym *sym)
338 return sym_get_data_by_offset(info, get_secindex(info, sym),
342 static const char *sech_name(const struct elf_info *info, Elf_Shdr *sechdr)
344 return sym_get_data_by_offset(info, info->secindex_strings,
348 static const char *sec_name(const struct elf_info *info, int secindex)
350 return sech_name(info, &info->sechdrs[secindex]);
353 #define strstarts(str, prefix) (strncmp(str, prefix, strlen(prefix)) == 0)
355 static enum export export_from_secname(struct elf_info *elf, unsigned int sec)
357 const char *secname = sec_name(elf, sec);
359 if (strstarts(secname, "___ksymtab+"))
361 else if (strstarts(secname, "___ksymtab_unused+"))
362 return export_unused;
363 else if (strstarts(secname, "___ksymtab_gpl+"))
365 else if (strstarts(secname, "___ksymtab_unused_gpl+"))
366 return export_unused_gpl;
367 else if (strstarts(secname, "___ksymtab_gpl_future+"))
368 return export_gpl_future;
370 return export_unknown;
373 static enum export export_from_sec(struct elf_info *elf, unsigned int sec)
375 if (sec == elf->export_sec)
377 else if (sec == elf->export_unused_sec)
378 return export_unused;
379 else if (sec == elf->export_gpl_sec)
381 else if (sec == elf->export_unused_gpl_sec)
382 return export_unused_gpl;
383 else if (sec == elf->export_gpl_future_sec)
384 return export_gpl_future;
386 return export_unknown;
389 static const char *namespace_from_kstrtabns(const struct elf_info *info,
392 const char *value = sym_get_data(info, sym);
393 return value[0] ? value : NULL;
396 static void sym_update_namespace(const char *symname, const char *namespace)
398 struct symbol *s = find_symbol(symname);
401 * That symbol should have been created earlier and thus this is
402 * actually an assertion.
405 merror("Could not update namespace(%s) for symbol %s\n",
412 namespace && namespace[0] ? NOFAIL(strdup(namespace)) : NULL;
416 * Add an exported symbol - it may have already been added without a
417 * CRC, in this case just update the CRC
419 static struct symbol *sym_add_exported(const char *name, struct module *mod,
422 struct symbol *s = find_symbol(name);
425 s = new_symbol(name, mod, export);
426 } else if (!external_module || s->module->is_vmlinux ||
428 warn("%s: '%s' exported twice. Previous export was in %s%s\n",
429 mod->name, name, s->module->name,
430 s->module->is_vmlinux ? "" : ".ko");
439 static void sym_set_crc(const char *name, unsigned int crc)
441 struct symbol *s = find_symbol(name);
444 * Ignore stand-alone __crc_*, which might be auto-generated symbols
445 * such as __*_veneer in ARM ELF.
454 static void *grab_file(const char *filename, size_t *size)
457 void *map = MAP_FAILED;
460 fd = open(filename, O_RDONLY);
467 map = mmap(NULL, *size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
471 if (map == MAP_FAILED)
476 static void release_file(void *file, size_t size)
481 static int parse_elf(struct elf_info *info, const char *filename)
487 const char *secstrings;
488 unsigned int symtab_idx = ~0U, symtab_shndx_idx = ~0U;
490 hdr = grab_file(filename, &info->size);
492 if (ignore_missing_files) {
493 fprintf(stderr, "%s: %s (ignored)\n", filename,
501 if (info->size < sizeof(*hdr)) {
502 /* file too small, assume this is an empty .o file */
505 /* Is this a valid ELF file? */
506 if ((hdr->e_ident[EI_MAG0] != ELFMAG0) ||
507 (hdr->e_ident[EI_MAG1] != ELFMAG1) ||
508 (hdr->e_ident[EI_MAG2] != ELFMAG2) ||
509 (hdr->e_ident[EI_MAG3] != ELFMAG3)) {
510 /* Not an ELF file - silently ignore it */
513 /* Fix endianness in ELF header */
514 hdr->e_type = TO_NATIVE(hdr->e_type);
515 hdr->e_machine = TO_NATIVE(hdr->e_machine);
516 hdr->e_version = TO_NATIVE(hdr->e_version);
517 hdr->e_entry = TO_NATIVE(hdr->e_entry);
518 hdr->e_phoff = TO_NATIVE(hdr->e_phoff);
519 hdr->e_shoff = TO_NATIVE(hdr->e_shoff);
520 hdr->e_flags = TO_NATIVE(hdr->e_flags);
521 hdr->e_ehsize = TO_NATIVE(hdr->e_ehsize);
522 hdr->e_phentsize = TO_NATIVE(hdr->e_phentsize);
523 hdr->e_phnum = TO_NATIVE(hdr->e_phnum);
524 hdr->e_shentsize = TO_NATIVE(hdr->e_shentsize);
525 hdr->e_shnum = TO_NATIVE(hdr->e_shnum);
526 hdr->e_shstrndx = TO_NATIVE(hdr->e_shstrndx);
527 sechdrs = (void *)hdr + hdr->e_shoff;
528 info->sechdrs = sechdrs;
530 /* Check if file offset is correct */
531 if (hdr->e_shoff > info->size) {
532 fatal("section header offset=%lu in file '%s' is bigger than filesize=%zu\n",
533 (unsigned long)hdr->e_shoff, filename, info->size);
537 if (hdr->e_shnum == SHN_UNDEF) {
539 * There are more than 64k sections,
540 * read count from .sh_size.
542 info->num_sections = TO_NATIVE(sechdrs[0].sh_size);
545 info->num_sections = hdr->e_shnum;
547 if (hdr->e_shstrndx == SHN_XINDEX) {
548 info->secindex_strings = TO_NATIVE(sechdrs[0].sh_link);
551 info->secindex_strings = hdr->e_shstrndx;
554 /* Fix endianness in section headers */
555 for (i = 0; i < info->num_sections; i++) {
556 sechdrs[i].sh_name = TO_NATIVE(sechdrs[i].sh_name);
557 sechdrs[i].sh_type = TO_NATIVE(sechdrs[i].sh_type);
558 sechdrs[i].sh_flags = TO_NATIVE(sechdrs[i].sh_flags);
559 sechdrs[i].sh_addr = TO_NATIVE(sechdrs[i].sh_addr);
560 sechdrs[i].sh_offset = TO_NATIVE(sechdrs[i].sh_offset);
561 sechdrs[i].sh_size = TO_NATIVE(sechdrs[i].sh_size);
562 sechdrs[i].sh_link = TO_NATIVE(sechdrs[i].sh_link);
563 sechdrs[i].sh_info = TO_NATIVE(sechdrs[i].sh_info);
564 sechdrs[i].sh_addralign = TO_NATIVE(sechdrs[i].sh_addralign);
565 sechdrs[i].sh_entsize = TO_NATIVE(sechdrs[i].sh_entsize);
567 /* Find symbol table. */
568 secstrings = (void *)hdr + sechdrs[info->secindex_strings].sh_offset;
569 for (i = 1; i < info->num_sections; i++) {
571 int nobits = sechdrs[i].sh_type == SHT_NOBITS;
573 if (!nobits && sechdrs[i].sh_offset > info->size) {
574 fatal("%s is truncated. sechdrs[i].sh_offset=%lu > "
575 "sizeof(*hrd)=%zu\n", filename,
576 (unsigned long)sechdrs[i].sh_offset,
580 secname = secstrings + sechdrs[i].sh_name;
581 if (strcmp(secname, ".modinfo") == 0) {
583 fatal("%s has NOBITS .modinfo\n", filename);
584 info->modinfo = (void *)hdr + sechdrs[i].sh_offset;
585 info->modinfo_len = sechdrs[i].sh_size;
586 } else if (strcmp(secname, "__ksymtab") == 0)
587 info->export_sec = i;
588 else if (strcmp(secname, "__ksymtab_unused") == 0)
589 info->export_unused_sec = i;
590 else if (strcmp(secname, "__ksymtab_gpl") == 0)
591 info->export_gpl_sec = i;
592 else if (strcmp(secname, "__ksymtab_unused_gpl") == 0)
593 info->export_unused_gpl_sec = i;
594 else if (strcmp(secname, "__ksymtab_gpl_future") == 0)
595 info->export_gpl_future_sec = i;
597 if (sechdrs[i].sh_type == SHT_SYMTAB) {
598 unsigned int sh_link_idx;
600 info->symtab_start = (void *)hdr +
601 sechdrs[i].sh_offset;
602 info->symtab_stop = (void *)hdr +
603 sechdrs[i].sh_offset + sechdrs[i].sh_size;
604 sh_link_idx = sechdrs[i].sh_link;
605 info->strtab = (void *)hdr +
606 sechdrs[sh_link_idx].sh_offset;
609 /* 32bit section no. table? ("more than 64k sections") */
610 if (sechdrs[i].sh_type == SHT_SYMTAB_SHNDX) {
611 symtab_shndx_idx = i;
612 info->symtab_shndx_start = (void *)hdr +
613 sechdrs[i].sh_offset;
614 info->symtab_shndx_stop = (void *)hdr +
615 sechdrs[i].sh_offset + sechdrs[i].sh_size;
618 if (!info->symtab_start)
619 fatal("%s has no symtab?\n", filename);
621 /* Fix endianness in symbols */
622 for (sym = info->symtab_start; sym < info->symtab_stop; sym++) {
623 sym->st_shndx = TO_NATIVE(sym->st_shndx);
624 sym->st_name = TO_NATIVE(sym->st_name);
625 sym->st_value = TO_NATIVE(sym->st_value);
626 sym->st_size = TO_NATIVE(sym->st_size);
629 if (symtab_shndx_idx != ~0U) {
631 if (symtab_idx != sechdrs[symtab_shndx_idx].sh_link)
632 fatal("%s: SYMTAB_SHNDX has bad sh_link: %u!=%u\n",
633 filename, sechdrs[symtab_shndx_idx].sh_link,
636 for (p = info->symtab_shndx_start; p < info->symtab_shndx_stop;
644 static void parse_elf_finish(struct elf_info *info)
646 release_file(info->hdr, info->size);
649 static int ignore_undef_symbol(struct elf_info *info, const char *symname)
651 /* ignore __this_module, it will be resolved shortly */
652 if (strcmp(symname, "__this_module") == 0)
654 /* ignore global offset table */
655 if (strcmp(symname, "_GLOBAL_OFFSET_TABLE_") == 0)
657 if (info->hdr->e_machine == EM_PPC)
658 /* Special register function linked on all modules during final link of .ko */
659 if (strstarts(symname, "_restgpr_") ||
660 strstarts(symname, "_savegpr_") ||
661 strstarts(symname, "_rest32gpr_") ||
662 strstarts(symname, "_save32gpr_") ||
663 strstarts(symname, "_restvr_") ||
664 strstarts(symname, "_savevr_"))
666 if (info->hdr->e_machine == EM_PPC64)
667 /* Special register function linked on all modules during final link of .ko */
668 if (strstarts(symname, "_restgpr0_") ||
669 strstarts(symname, "_savegpr0_") ||
670 strstarts(symname, "_restvr_") ||
671 strstarts(symname, "_savevr_") ||
672 strcmp(symname, ".TOC.") == 0)
674 /* Do not ignore this symbol */
678 static void handle_modversion(const struct module *mod,
679 const struct elf_info *info,
680 const Elf_Sym *sym, const char *symname)
684 if (sym->st_shndx == SHN_UNDEF) {
685 warn("EXPORT symbol \"%s\" [%s%s] version generation failed, symbol will not be versioned.\n",
686 symname, mod->name, mod->is_vmlinux ? "" : ".ko");
690 if (sym->st_shndx == SHN_ABS) {
695 /* symbol points to the CRC in the ELF object */
696 crcp = sym_get_data(info, sym);
697 crc = TO_NATIVE(*crcp);
699 sym_set_crc(symname, crc);
702 static void handle_symbol(struct module *mod, struct elf_info *info,
703 const Elf_Sym *sym, const char *symname)
708 if (strstarts(symname, "__ksymtab"))
709 export = export_from_secname(info, get_secindex(info, sym));
711 export = export_from_sec(info, get_secindex(info, sym));
713 switch (sym->st_shndx) {
715 if (strstarts(symname, "__gnu_lto_")) {
716 /* Should warn here, but modpost runs before the linker */
718 warn("\"%s\" [%s] is COMMON symbol\n", symname, mod->name);
721 /* undefined symbol */
722 if (ELF_ST_BIND(sym->st_info) != STB_GLOBAL &&
723 ELF_ST_BIND(sym->st_info) != STB_WEAK)
725 if (ignore_undef_symbol(info, symname))
727 if (info->hdr->e_machine == EM_SPARC ||
728 info->hdr->e_machine == EM_SPARCV9) {
729 /* Ignore register directives. */
730 if (ELF_ST_TYPE(sym->st_info) == STT_SPARC_REGISTER)
732 if (symname[0] == '.') {
733 char *munged = NOFAIL(strdup(symname));
735 munged[1] = toupper(munged[1]);
740 mod->unres = alloc_symbol(symname,
741 ELF_ST_BIND(sym->st_info) == STB_WEAK,
745 /* All exported symbols */
746 if (strstarts(symname, "__ksymtab_")) {
747 name = symname + strlen("__ksymtab_");
748 sym_add_exported(name, mod, export);
750 if (strcmp(symname, "init_module") == 0)
752 if (strcmp(symname, "cleanup_module") == 0)
753 mod->has_cleanup = 1;
759 * Parse tag=value strings from .modinfo section
761 static char *next_string(char *string, unsigned long *secsize)
763 /* Skip non-zero chars */
766 if ((*secsize)-- <= 1)
770 /* Skip any zero padding. */
773 if ((*secsize)-- <= 1)
779 static char *get_next_modinfo(struct elf_info *info, const char *tag,
783 unsigned int taglen = strlen(tag);
784 char *modinfo = info->modinfo;
785 unsigned long size = info->modinfo_len;
788 size -= prev - modinfo;
789 modinfo = next_string(prev, &size);
792 for (p = modinfo; p; p = next_string(p, &size)) {
793 if (strncmp(p, tag, taglen) == 0 && p[taglen] == '=')
794 return p + taglen + 1;
799 static char *get_modinfo(struct elf_info *info, const char *tag)
802 return get_next_modinfo(info, tag, NULL);
806 * Test if string s ends in string sub
809 static int strrcmp(const char *s, const char *sub)
817 sublen = strlen(sub);
819 if ((slen == 0) || (sublen == 0))
825 return memcmp(s + slen - sublen, sub, sublen);
828 static const char *sym_name(struct elf_info *elf, Elf_Sym *sym)
831 return elf->strtab + sym->st_name;
836 /* The pattern is an array of simple patterns.
837 * "foo" will match an exact string equal to "foo"
838 * "*foo" will match a string that ends with "foo"
839 * "foo*" will match a string that begins with "foo"
840 * "*foo*" will match a string that contains "foo"
842 static int match(const char *sym, const char * const pat[])
847 const char *endp = p + strlen(p) - 1;
850 if (*p == '*' && *endp == '*') {
851 char *bare = NOFAIL(strndup(p + 1, strlen(p) - 2));
852 char *here = strstr(sym, bare);
859 else if (*p == '*') {
860 if (strrcmp(sym, p + 1) == 0)
864 else if (*endp == '*') {
865 if (strncmp(sym, p, strlen(p) - 1) == 0)
870 if (strcmp(p, sym) == 0)
878 /* sections that we do not want to do full section mismatch check on */
879 static const char *const section_white_list[] =
883 ".cranges", /* sh64 */
884 ".zdebug*", /* Compressed debug sections. */
885 ".GCC.command.line", /* record-gcc-switches */
886 ".mdebug*", /* alpha, score, mips etc. */
887 ".pdr", /* alpha, score, mips etc. */
892 ".xt.prop", /* xtensa */
893 ".xt.lit", /* xtensa */
894 ".arcextmap*", /* arc */
895 ".gnu.linkonce.arcext*", /* arc : modules */
896 ".cmem*", /* EZchip */
897 ".fmt_slot*", /* EZchip */
904 * This is used to find sections missing the SHF_ALLOC flag.
905 * The cause of this is often a section specified in assembler
906 * without "ax" / "aw".
908 static void check_section(const char *modname, struct elf_info *elf,
911 const char *sec = sech_name(elf, sechdr);
913 if (sechdr->sh_type == SHT_PROGBITS &&
914 !(sechdr->sh_flags & SHF_ALLOC) &&
915 !match(sec, section_white_list)) {
916 warn("%s (%s): unexpected non-allocatable section.\n"
917 "Did you forget to use \"ax\"/\"aw\" in a .S file?\n"
918 "Note that for example <linux/init.h> contains\n"
919 "section definitions for use in .S files.\n\n",
926 #define ALL_INIT_DATA_SECTIONS \
927 ".init.setup", ".init.rodata", ".meminit.rodata", \
928 ".init.data", ".meminit.data"
929 #define ALL_EXIT_DATA_SECTIONS \
930 ".exit.data", ".memexit.data"
932 #define ALL_INIT_TEXT_SECTIONS \
933 ".init.text", ".meminit.text"
934 #define ALL_EXIT_TEXT_SECTIONS \
935 ".exit.text", ".memexit.text"
937 #define ALL_PCI_INIT_SECTIONS \
938 ".pci_fixup_early", ".pci_fixup_header", ".pci_fixup_final", \
939 ".pci_fixup_enable", ".pci_fixup_resume", \
940 ".pci_fixup_resume_early", ".pci_fixup_suspend"
942 #define ALL_XXXINIT_SECTIONS MEM_INIT_SECTIONS
943 #define ALL_XXXEXIT_SECTIONS MEM_EXIT_SECTIONS
945 #define ALL_INIT_SECTIONS INIT_SECTIONS, ALL_XXXINIT_SECTIONS
946 #define ALL_EXIT_SECTIONS EXIT_SECTIONS, ALL_XXXEXIT_SECTIONS
948 #define DATA_SECTIONS ".data", ".data.rel"
949 #define TEXT_SECTIONS ".text", ".text.unlikely", ".sched.text", \
950 ".kprobes.text", ".cpuidle.text", ".noinstr.text"
951 #define OTHER_TEXT_SECTIONS ".ref.text", ".head.text", ".spinlock.text", \
952 ".fixup", ".entry.text", ".exception.text", ".text.*", \
955 #define INIT_SECTIONS ".init.*"
956 #define MEM_INIT_SECTIONS ".meminit.*"
958 #define EXIT_SECTIONS ".exit.*"
959 #define MEM_EXIT_SECTIONS ".memexit.*"
961 #define ALL_TEXT_SECTIONS ALL_INIT_TEXT_SECTIONS, ALL_EXIT_TEXT_SECTIONS, \
962 TEXT_SECTIONS, OTHER_TEXT_SECTIONS
964 /* init data sections */
965 static const char *const init_data_sections[] =
966 { ALL_INIT_DATA_SECTIONS, NULL };
968 /* all init sections */
969 static const char *const init_sections[] = { ALL_INIT_SECTIONS, NULL };
971 /* All init and exit sections (code + data) */
972 static const char *const init_exit_sections[] =
973 {ALL_INIT_SECTIONS, ALL_EXIT_SECTIONS, NULL };
975 /* all text sections */
976 static const char *const text_sections[] = { ALL_TEXT_SECTIONS, NULL };
979 static const char *const data_sections[] = { DATA_SECTIONS, NULL };
982 /* symbols in .data that may refer to init/exit sections */
983 #define DEFAULT_SYMBOL_WHITE_LIST \
985 "*_template", /* scsi uses *_template a lot */ \
986 "*_timer", /* arm uses ops structures named _timer a lot */ \
987 "*_sht", /* scsi also used *_sht to some extent */ \
993 static const char *const head_sections[] = { ".head.text*", NULL };
994 static const char *const linker_symbols[] =
995 { "__init_begin", "_sinittext", "_einittext", NULL };
996 static const char *const optim_symbols[] = { "*.constprop.*", NULL };
1003 XXXINIT_TO_SOME_INIT,
1004 XXXEXIT_TO_SOME_EXIT,
1005 ANY_INIT_TO_ANY_EXIT,
1006 ANY_EXIT_TO_ANY_INIT,
1007 EXPORT_TO_INIT_EXIT,
1008 EXTABLE_TO_NON_TEXT,
1012 * Describe how to match sections on different criterias:
1014 * @fromsec: Array of sections to be matched.
1016 * @bad_tosec: Relocations applied to a section in @fromsec to a section in
1017 * this array is forbidden (black-list). Can be empty.
1019 * @good_tosec: Relocations applied to a section in @fromsec must be
1020 * targetting sections in this array (white-list). Can be empty.
1022 * @mismatch: Type of mismatch.
1024 * @symbol_white_list: Do not match a relocation to a symbol in this list
1025 * even if it is targetting a section in @bad_to_sec.
1027 * @handler: Specific handler to call when a match is found. If NULL,
1028 * default_mismatch_handler() will be called.
1031 struct sectioncheck {
1032 const char *fromsec[20];
1033 const char *bad_tosec[20];
1034 const char *good_tosec[20];
1035 enum mismatch mismatch;
1036 const char *symbol_white_list[20];
1037 void (*handler)(const char *modname, struct elf_info *elf,
1038 const struct sectioncheck* const mismatch,
1039 Elf_Rela *r, Elf_Sym *sym, const char *fromsec);
1043 static void extable_mismatch_handler(const char *modname, struct elf_info *elf,
1044 const struct sectioncheck* const mismatch,
1045 Elf_Rela *r, Elf_Sym *sym,
1046 const char *fromsec);
1048 static const struct sectioncheck sectioncheck[] = {
1049 /* Do not reference init/exit code/data from
1050 * normal code and data
1053 .fromsec = { TEXT_SECTIONS, NULL },
1054 .bad_tosec = { ALL_INIT_SECTIONS, NULL },
1055 .mismatch = TEXT_TO_ANY_INIT,
1056 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1059 .fromsec = { DATA_SECTIONS, NULL },
1060 .bad_tosec = { ALL_XXXINIT_SECTIONS, NULL },
1061 .mismatch = DATA_TO_ANY_INIT,
1062 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1065 .fromsec = { DATA_SECTIONS, NULL },
1066 .bad_tosec = { INIT_SECTIONS, NULL },
1067 .mismatch = DATA_TO_ANY_INIT,
1068 .symbol_white_list = {
1069 "*_template", "*_timer", "*_sht", "*_ops",
1070 "*_probe", "*_probe_one", "*_console", NULL
1074 .fromsec = { TEXT_SECTIONS, NULL },
1075 .bad_tosec = { ALL_EXIT_SECTIONS, NULL },
1076 .mismatch = TEXT_TO_ANY_EXIT,
1077 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1080 .fromsec = { DATA_SECTIONS, NULL },
1081 .bad_tosec = { ALL_EXIT_SECTIONS, NULL },
1082 .mismatch = DATA_TO_ANY_EXIT,
1083 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1085 /* Do not reference init code/data from meminit code/data */
1087 .fromsec = { ALL_XXXINIT_SECTIONS, NULL },
1088 .bad_tosec = { INIT_SECTIONS, NULL },
1089 .mismatch = XXXINIT_TO_SOME_INIT,
1090 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1092 /* Do not reference exit code/data from memexit code/data */
1094 .fromsec = { ALL_XXXEXIT_SECTIONS, NULL },
1095 .bad_tosec = { EXIT_SECTIONS, NULL },
1096 .mismatch = XXXEXIT_TO_SOME_EXIT,
1097 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1099 /* Do not use exit code/data from init code */
1101 .fromsec = { ALL_INIT_SECTIONS, NULL },
1102 .bad_tosec = { ALL_EXIT_SECTIONS, NULL },
1103 .mismatch = ANY_INIT_TO_ANY_EXIT,
1104 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1106 /* Do not use init code/data from exit code */
1108 .fromsec = { ALL_EXIT_SECTIONS, NULL },
1109 .bad_tosec = { ALL_INIT_SECTIONS, NULL },
1110 .mismatch = ANY_EXIT_TO_ANY_INIT,
1111 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1114 .fromsec = { ALL_PCI_INIT_SECTIONS, NULL },
1115 .bad_tosec = { INIT_SECTIONS, NULL },
1116 .mismatch = ANY_INIT_TO_ANY_EXIT,
1117 .symbol_white_list = { NULL },
1119 /* Do not export init/exit functions or data */
1121 .fromsec = { "__ksymtab*", NULL },
1122 .bad_tosec = { INIT_SECTIONS, EXIT_SECTIONS, NULL },
1123 .mismatch = EXPORT_TO_INIT_EXIT,
1124 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1127 .fromsec = { "__ex_table", NULL },
1128 /* If you're adding any new black-listed sections in here, consider
1129 * adding a special 'printer' for them in scripts/check_extable.
1131 .bad_tosec = { ".altinstr_replacement", NULL },
1132 .good_tosec = {ALL_TEXT_SECTIONS , NULL},
1133 .mismatch = EXTABLE_TO_NON_TEXT,
1134 .handler = extable_mismatch_handler,
1138 static const struct sectioncheck *section_mismatch(
1139 const char *fromsec, const char *tosec)
1142 int elems = sizeof(sectioncheck) / sizeof(struct sectioncheck);
1143 const struct sectioncheck *check = §ioncheck[0];
1146 * The target section could be the SHT_NUL section when we're
1147 * handling relocations to un-resolved symbols, trying to match it
1148 * doesn't make much sense and causes build failures on parisc
1154 for (i = 0; i < elems; i++) {
1155 if (match(fromsec, check->fromsec)) {
1156 if (check->bad_tosec[0] && match(tosec, check->bad_tosec))
1158 if (check->good_tosec[0] && !match(tosec, check->good_tosec))
1167 * Whitelist to allow certain references to pass with no warning.
1170 * If a module parameter is declared __initdata and permissions=0
1171 * then this is legal despite the warning generated.
1172 * We cannot see value of permissions here, so just ignore
1174 * The pattern is identified by:
1175 * tosec = .init.data
1180 * module_param_call() ops can refer to __init set function if permissions=0
1181 * The pattern is identified by:
1182 * tosec = .init.text
1184 * atsym = __param_ops_*
1187 * Many drivers utilise a *driver container with references to
1188 * add, remove, probe functions etc.
1189 * the pattern is identified by:
1190 * tosec = init or exit section
1191 * fromsec = data section
1192 * atsym = *driver, *_template, *_sht, *_ops, *_probe,
1193 * *probe_one, *_console, *_timer
1196 * Whitelist all references from .head.text to any init section
1199 * Some symbols belong to init section but still it is ok to reference
1200 * these from non-init sections as these symbols don't have any memory
1201 * allocated for them and symbol address and value are same. So even
1202 * if init section is freed, its ok to reference those symbols.
1203 * For ex. symbols marking the init section boundaries.
1204 * This pattern is identified by
1205 * refsymname = __init_begin, _sinittext, _einittext
1208 * GCC may optimize static inlines when fed constant arg(s) resulting
1209 * in functions like cpumask_empty() -- generating an associated symbol
1210 * cpumask_empty.constprop.3 that appears in the audit. If the const that
1211 * is passed in comes from __init, like say nmi_ipi_mask, we get a
1212 * meaningless section warning. May need to add isra symbols too...
1213 * This pattern is identified by
1214 * tosec = init section
1215 * fromsec = text section
1216 * refsymname = *.constprop.*
1219 * Hide section mismatch warnings for ELF local symbols. The goal
1220 * is to eliminate false positive modpost warnings caused by
1221 * compiler-generated ELF local symbol names such as ".LANCHOR1".
1222 * Autogenerated symbol names bypass modpost's "Pattern 2"
1223 * whitelisting, which relies on pattern-matching against symbol
1224 * names to work. (One situation where gcc can autogenerate ELF
1225 * local symbols is when "-fsection-anchors" is used.)
1227 static int secref_whitelist(const struct sectioncheck *mismatch,
1228 const char *fromsec, const char *fromsym,
1229 const char *tosec, const char *tosym)
1231 /* Check for pattern 1 */
1232 if (match(tosec, init_data_sections) &&
1233 match(fromsec, data_sections) &&
1234 strstarts(fromsym, "__param"))
1237 /* Check for pattern 1a */
1238 if (strcmp(tosec, ".init.text") == 0 &&
1239 match(fromsec, data_sections) &&
1240 strstarts(fromsym, "__param_ops_"))
1243 /* Check for pattern 2 */
1244 if (match(tosec, init_exit_sections) &&
1245 match(fromsec, data_sections) &&
1246 match(fromsym, mismatch->symbol_white_list))
1249 /* Check for pattern 3 */
1250 if (match(fromsec, head_sections) &&
1251 match(tosec, init_sections))
1254 /* Check for pattern 4 */
1255 if (match(tosym, linker_symbols))
1258 /* Check for pattern 5 */
1259 if (match(fromsec, text_sections) &&
1260 match(tosec, init_sections) &&
1261 match(fromsym, optim_symbols))
1264 /* Check for pattern 6 */
1265 if (strstarts(fromsym, ".L"))
1271 static inline int is_arm_mapping_symbol(const char *str)
1273 return str[0] == '$' && strchr("axtd", str[1])
1274 && (str[2] == '\0' || str[2] == '.');
1278 * If there's no name there, ignore it; likewise, ignore it if it's
1279 * one of the magic symbols emitted used by current ARM tools.
1281 * Otherwise if find_symbols_between() returns those symbols, they'll
1282 * fail the whitelist tests and cause lots of false alarms ... fixable
1283 * only by merging __exit and __init sections into __text, bloating
1284 * the kernel (which is especially evil on embedded platforms).
1286 static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym)
1288 const char *name = elf->strtab + sym->st_name;
1290 if (!name || !strlen(name))
1292 return !is_arm_mapping_symbol(name);
1296 * Find symbol based on relocation record info.
1297 * In some cases the symbol supplied is a valid symbol so
1298 * return refsym. If st_name != 0 we assume this is a valid symbol.
1299 * In other cases the symbol needs to be looked up in the symbol table
1300 * based on section and address.
1302 static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr,
1306 Elf_Sym *near = NULL;
1307 Elf64_Sword distance = 20;
1309 unsigned int relsym_secindex;
1311 if (relsym->st_name != 0)
1314 relsym_secindex = get_secindex(elf, relsym);
1315 for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
1316 if (get_secindex(elf, sym) != relsym_secindex)
1318 if (ELF_ST_TYPE(sym->st_info) == STT_SECTION)
1320 if (!is_valid_name(elf, sym))
1322 if (sym->st_value == addr)
1324 /* Find a symbol nearby - addr are maybe negative */
1325 d = sym->st_value - addr;
1327 d = addr - sym->st_value;
1333 /* We need a close match */
1341 * Find symbols before or equal addr and after addr - in the section sec.
1342 * If we find two symbols with equal offset prefer one with a valid name.
1343 * The ELF format may have a better way to detect what type of symbol
1344 * it is, but this works for now.
1346 static Elf_Sym *find_elf_symbol2(struct elf_info *elf, Elf_Addr addr,
1350 Elf_Sym *near = NULL;
1351 Elf_Addr distance = ~0;
1353 for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
1356 if (is_shndx_special(sym->st_shndx))
1358 symsec = sec_name(elf, get_secindex(elf, sym));
1359 if (strcmp(symsec, sec) != 0)
1361 if (!is_valid_name(elf, sym))
1363 if (sym->st_value <= addr) {
1364 if ((addr - sym->st_value) < distance) {
1365 distance = addr - sym->st_value;
1367 } else if ((addr - sym->st_value) == distance) {
1376 * Convert a section name to the function/data attribute
1377 * .init.text => __init
1378 * .memexitconst => __memconst
1381 * The memory of returned value has been allocated on a heap. The user of this
1382 * method should free it after usage.
1384 static char *sec2annotation(const char *s)
1386 if (match(s, init_exit_sections)) {
1387 char *p = NOFAIL(malloc(20));
1394 while (*s && *s != '.')
1399 if (strstr(s, "rodata") != NULL)
1400 strcat(p, "const ");
1401 else if (strstr(s, "data") != NULL)
1407 return NOFAIL(strdup(""));
1411 static int is_function(Elf_Sym *sym)
1414 return ELF_ST_TYPE(sym->st_info) == STT_FUNC;
1419 static void print_section_list(const char * const list[20])
1421 const char *const *s = list;
1424 fprintf(stderr, "%s", *s);
1427 fprintf(stderr, ", ");
1429 fprintf(stderr, "\n");
1432 static inline void get_pretty_name(int is_func, const char** name, const char** name_p)
1435 case 0: *name = "variable"; *name_p = ""; break;
1436 case 1: *name = "function"; *name_p = "()"; break;
1437 default: *name = "(unknown reference)"; *name_p = ""; break;
1442 * Print a warning about a section mismatch.
1443 * Try to find symbols near it so user can find it.
1444 * Check whitelist before warning - it may be a false positive.
1446 static void report_sec_mismatch(const char *modname,
1447 const struct sectioncheck *mismatch,
1448 const char *fromsec,
1449 unsigned long long fromaddr,
1450 const char *fromsym,
1452 const char *tosec, const char *tosym,
1455 const char *from, *from_p;
1456 const char *to, *to_p;
1460 sec_mismatch_count++;
1462 get_pretty_name(from_is_func, &from, &from_p);
1463 get_pretty_name(to_is_func, &to, &to_p);
1465 warn("%s(%s+0x%llx): Section mismatch in reference from the %s %s%s "
1466 "to the %s %s:%s%s\n",
1467 modname, fromsec, fromaddr, from, fromsym, from_p, to, tosec,
1470 switch (mismatch->mismatch) {
1471 case TEXT_TO_ANY_INIT:
1472 prl_from = sec2annotation(fromsec);
1473 prl_to = sec2annotation(tosec);
1475 "The function %s%s() references\n"
1477 "This is often because %s lacks a %s\n"
1478 "annotation or the annotation of %s is wrong.\n",
1480 to, prl_to, tosym, to_p,
1481 fromsym, prl_to, tosym);
1485 case DATA_TO_ANY_INIT: {
1486 prl_to = sec2annotation(tosec);
1488 "The variable %s references\n"
1490 "If the reference is valid then annotate the\n"
1491 "variable with __init* or __refdata (see linux/init.h) "
1492 "or name the variable:\n",
1493 fromsym, to, prl_to, tosym, to_p);
1494 print_section_list(mismatch->symbol_white_list);
1498 case TEXT_TO_ANY_EXIT:
1499 prl_to = sec2annotation(tosec);
1501 "The function %s() references a %s in an exit section.\n"
1502 "Often the %s %s%s has valid usage outside the exit section\n"
1503 "and the fix is to remove the %sannotation of %s.\n",
1504 fromsym, to, to, tosym, to_p, prl_to, tosym);
1507 case DATA_TO_ANY_EXIT: {
1508 prl_to = sec2annotation(tosec);
1510 "The variable %s references\n"
1512 "If the reference is valid then annotate the\n"
1513 "variable with __exit* (see linux/init.h) or "
1514 "name the variable:\n",
1515 fromsym, to, prl_to, tosym, to_p);
1516 print_section_list(mismatch->symbol_white_list);
1520 case XXXINIT_TO_SOME_INIT:
1521 case XXXEXIT_TO_SOME_EXIT:
1522 prl_from = sec2annotation(fromsec);
1523 prl_to = sec2annotation(tosec);
1525 "The %s %s%s%s references\n"
1527 "If %s is only used by %s then\n"
1528 "annotate %s with a matching annotation.\n",
1529 from, prl_from, fromsym, from_p,
1530 to, prl_to, tosym, to_p,
1531 tosym, fromsym, tosym);
1535 case ANY_INIT_TO_ANY_EXIT:
1536 prl_from = sec2annotation(fromsec);
1537 prl_to = sec2annotation(tosec);
1539 "The %s %s%s%s references\n"
1541 "This is often seen when error handling "
1542 "in the init function\n"
1543 "uses functionality in the exit path.\n"
1544 "The fix is often to remove the %sannotation of\n"
1545 "%s%s so it may be used outside an exit section.\n",
1546 from, prl_from, fromsym, from_p,
1547 to, prl_to, tosym, to_p,
1548 prl_to, tosym, to_p);
1552 case ANY_EXIT_TO_ANY_INIT:
1553 prl_from = sec2annotation(fromsec);
1554 prl_to = sec2annotation(tosec);
1556 "The %s %s%s%s references\n"
1558 "This is often seen when error handling "
1559 "in the exit function\n"
1560 "uses functionality in the init path.\n"
1561 "The fix is often to remove the %sannotation of\n"
1562 "%s%s so it may be used outside an init section.\n",
1563 from, prl_from, fromsym, from_p,
1564 to, prl_to, tosym, to_p,
1565 prl_to, tosym, to_p);
1569 case EXPORT_TO_INIT_EXIT:
1570 prl_to = sec2annotation(tosec);
1572 "The symbol %s is exported and annotated %s\n"
1573 "Fix this by removing the %sannotation of %s "
1574 "or drop the export.\n",
1575 tosym, prl_to, prl_to, tosym);
1578 case EXTABLE_TO_NON_TEXT:
1579 fatal("There's a special handler for this mismatch type, "
1580 "we should never get here.");
1583 fprintf(stderr, "\n");
1586 static void default_mismatch_handler(const char *modname, struct elf_info *elf,
1587 const struct sectioncheck* const mismatch,
1588 Elf_Rela *r, Elf_Sym *sym, const char *fromsec)
1594 const char *fromsym;
1596 from = find_elf_symbol2(elf, r->r_offset, fromsec);
1597 fromsym = sym_name(elf, from);
1599 if (strstarts(fromsym, "reference___initcall"))
1602 tosec = sec_name(elf, get_secindex(elf, sym));
1603 to = find_elf_symbol(elf, r->r_addend, sym);
1604 tosym = sym_name(elf, to);
1606 /* check whitelist - we may ignore it */
1607 if (secref_whitelist(mismatch,
1608 fromsec, fromsym, tosec, tosym)) {
1609 report_sec_mismatch(modname, mismatch,
1610 fromsec, r->r_offset, fromsym,
1611 is_function(from), tosec, tosym,
1616 static int is_executable_section(struct elf_info* elf, unsigned int section_index)
1618 if (section_index > elf->num_sections)
1619 fatal("section_index is outside elf->num_sections!\n");
1621 return ((elf->sechdrs[section_index].sh_flags & SHF_EXECINSTR) == SHF_EXECINSTR);
1625 * We rely on a gross hack in section_rel[a]() calling find_extable_entry_size()
1626 * to know the sizeof(struct exception_table_entry) for the target architecture.
1628 static unsigned int extable_entry_size = 0;
1629 static void find_extable_entry_size(const char* const sec, const Elf_Rela* r)
1632 * If we're currently checking the second relocation within __ex_table,
1633 * that relocation offset tells us the offsetof(struct
1634 * exception_table_entry, fixup) which is equal to sizeof(struct
1635 * exception_table_entry) divided by two. We use that to our advantage
1636 * since there's no portable way to get that size as every architecture
1637 * seems to go with different sized types. Not pretty but better than
1638 * hard-coding the size for every architecture..
1640 if (!extable_entry_size)
1641 extable_entry_size = r->r_offset * 2;
1644 static inline bool is_extable_fault_address(Elf_Rela *r)
1647 * extable_entry_size is only discovered after we've handled the
1648 * _second_ relocation in __ex_table, so only abort when we're not
1649 * handling the first reloc and extable_entry_size is zero.
1651 if (r->r_offset && extable_entry_size == 0)
1652 fatal("extable_entry size hasn't been discovered!\n");
1654 return ((r->r_offset == 0) ||
1655 (r->r_offset % extable_entry_size == 0));
1658 #define is_second_extable_reloc(Start, Cur, Sec) \
1659 (((Cur) == (Start) + 1) && (strcmp("__ex_table", (Sec)) == 0))
1661 static void report_extable_warnings(const char* modname, struct elf_info* elf,
1662 const struct sectioncheck* const mismatch,
1663 Elf_Rela* r, Elf_Sym* sym,
1664 const char* fromsec, const char* tosec)
1666 Elf_Sym* fromsym = find_elf_symbol2(elf, r->r_offset, fromsec);
1667 const char* fromsym_name = sym_name(elf, fromsym);
1668 Elf_Sym* tosym = find_elf_symbol(elf, r->r_addend, sym);
1669 const char* tosym_name = sym_name(elf, tosym);
1670 const char* from_pretty_name;
1671 const char* from_pretty_name_p;
1672 const char* to_pretty_name;
1673 const char* to_pretty_name_p;
1675 get_pretty_name(is_function(fromsym),
1676 &from_pretty_name, &from_pretty_name_p);
1677 get_pretty_name(is_function(tosym),
1678 &to_pretty_name, &to_pretty_name_p);
1680 warn("%s(%s+0x%lx): Section mismatch in reference"
1681 " from the %s %s%s to the %s %s:%s%s\n",
1682 modname, fromsec, (long)r->r_offset, from_pretty_name,
1683 fromsym_name, from_pretty_name_p,
1684 to_pretty_name, tosec, tosym_name, to_pretty_name_p);
1686 if (!match(tosec, mismatch->bad_tosec) &&
1687 is_executable_section(elf, get_secindex(elf, sym)))
1689 "The relocation at %s+0x%lx references\n"
1690 "section \"%s\" which is not in the list of\n"
1691 "authorized sections. If you're adding a new section\n"
1692 "and/or if this reference is valid, add \"%s\" to the\n"
1693 "list of authorized sections to jump to on fault.\n"
1694 "This can be achieved by adding \"%s\" to \n"
1695 "OTHER_TEXT_SECTIONS in scripts/mod/modpost.c.\n",
1696 fromsec, (long)r->r_offset, tosec, tosec, tosec);
1699 static void extable_mismatch_handler(const char* modname, struct elf_info *elf,
1700 const struct sectioncheck* const mismatch,
1701 Elf_Rela* r, Elf_Sym* sym,
1702 const char *fromsec)
1704 const char* tosec = sec_name(elf, get_secindex(elf, sym));
1706 sec_mismatch_count++;
1708 report_extable_warnings(modname, elf, mismatch, r, sym, fromsec, tosec);
1710 if (match(tosec, mismatch->bad_tosec))
1711 fatal("The relocation at %s+0x%lx references\n"
1712 "section \"%s\" which is black-listed.\n"
1713 "Something is seriously wrong and should be fixed.\n"
1714 "You might get more information about where this is\n"
1715 "coming from by using scripts/check_extable.sh %s\n",
1716 fromsec, (long)r->r_offset, tosec, modname);
1717 else if (!is_executable_section(elf, get_secindex(elf, sym))) {
1718 if (is_extable_fault_address(r))
1719 fatal("The relocation at %s+0x%lx references\n"
1720 "section \"%s\" which is not executable, IOW\n"
1721 "it is not possible for the kernel to fault\n"
1722 "at that address. Something is seriously wrong\n"
1723 "and should be fixed.\n",
1724 fromsec, (long)r->r_offset, tosec);
1726 fatal("The relocation at %s+0x%lx references\n"
1727 "section \"%s\" which is not executable, IOW\n"
1728 "the kernel will fault if it ever tries to\n"
1729 "jump to it. Something is seriously wrong\n"
1730 "and should be fixed.\n",
1731 fromsec, (long)r->r_offset, tosec);
1735 static void check_section_mismatch(const char *modname, struct elf_info *elf,
1736 Elf_Rela *r, Elf_Sym *sym, const char *fromsec)
1738 const char *tosec = sec_name(elf, get_secindex(elf, sym));
1739 const struct sectioncheck *mismatch = section_mismatch(fromsec, tosec);
1742 if (mismatch->handler)
1743 mismatch->handler(modname, elf, mismatch,
1746 default_mismatch_handler(modname, elf, mismatch,
1751 static unsigned int *reloc_location(struct elf_info *elf,
1752 Elf_Shdr *sechdr, Elf_Rela *r)
1754 return sym_get_data_by_offset(elf, sechdr->sh_info, r->r_offset);
1757 static int addend_386_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1759 unsigned int r_typ = ELF_R_TYPE(r->r_info);
1760 unsigned int *location = reloc_location(elf, sechdr, r);
1764 r->r_addend = TO_NATIVE(*location);
1767 r->r_addend = TO_NATIVE(*location) + 4;
1768 /* For CONFIG_RELOCATABLE=y */
1769 if (elf->hdr->e_type == ET_EXEC)
1770 r->r_addend += r->r_offset;
1777 #define R_ARM_CALL 28
1779 #ifndef R_ARM_JUMP24
1780 #define R_ARM_JUMP24 29
1783 #ifndef R_ARM_THM_CALL
1784 #define R_ARM_THM_CALL 10
1786 #ifndef R_ARM_THM_JUMP24
1787 #define R_ARM_THM_JUMP24 30
1789 #ifndef R_ARM_THM_JUMP19
1790 #define R_ARM_THM_JUMP19 51
1793 static int addend_arm_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1795 unsigned int r_typ = ELF_R_TYPE(r->r_info);
1799 /* From ARM ABI: (S + A) | T */
1800 r->r_addend = (int)(long)
1801 (elf->symtab_start + ELF_R_SYM(r->r_info));
1806 case R_ARM_THM_CALL:
1807 case R_ARM_THM_JUMP24:
1808 case R_ARM_THM_JUMP19:
1809 /* From ARM ABI: ((S + A) | T) - P */
1810 r->r_addend = (int)(long)(elf->hdr +
1812 (r->r_offset - sechdr->sh_addr));
1820 static int addend_mips_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1822 unsigned int r_typ = ELF_R_TYPE(r->r_info);
1823 unsigned int *location = reloc_location(elf, sechdr, r);
1826 if (r_typ == R_MIPS_HI16)
1827 return 1; /* skip this */
1828 inst = TO_NATIVE(*location);
1831 r->r_addend = inst & 0xffff;
1834 r->r_addend = (inst & 0x03ffffff) << 2;
1843 static void section_rela(const char *modname, struct elf_info *elf,
1850 const char *fromsec;
1852 Elf_Rela *start = (void *)elf->hdr + sechdr->sh_offset;
1853 Elf_Rela *stop = (void *)start + sechdr->sh_size;
1855 fromsec = sech_name(elf, sechdr);
1856 fromsec += strlen(".rela");
1857 /* if from section (name) is know good then skip it */
1858 if (match(fromsec, section_white_list))
1861 for (rela = start; rela < stop; rela++) {
1862 r.r_offset = TO_NATIVE(rela->r_offset);
1863 #if KERNEL_ELFCLASS == ELFCLASS64
1864 if (elf->hdr->e_machine == EM_MIPS) {
1866 r_sym = ELF64_MIPS_R_SYM(rela->r_info);
1867 r_sym = TO_NATIVE(r_sym);
1868 r_typ = ELF64_MIPS_R_TYPE(rela->r_info);
1869 r.r_info = ELF64_R_INFO(r_sym, r_typ);
1871 r.r_info = TO_NATIVE(rela->r_info);
1872 r_sym = ELF_R_SYM(r.r_info);
1875 r.r_info = TO_NATIVE(rela->r_info);
1876 r_sym = ELF_R_SYM(r.r_info);
1878 r.r_addend = TO_NATIVE(rela->r_addend);
1879 sym = elf->symtab_start + r_sym;
1880 /* Skip special sections */
1881 if (is_shndx_special(sym->st_shndx))
1883 if (is_second_extable_reloc(start, rela, fromsec))
1884 find_extable_entry_size(fromsec, &r);
1885 check_section_mismatch(modname, elf, &r, sym, fromsec);
1889 static void section_rel(const char *modname, struct elf_info *elf,
1896 const char *fromsec;
1898 Elf_Rel *start = (void *)elf->hdr + sechdr->sh_offset;
1899 Elf_Rel *stop = (void *)start + sechdr->sh_size;
1901 fromsec = sech_name(elf, sechdr);
1902 fromsec += strlen(".rel");
1903 /* if from section (name) is know good then skip it */
1904 if (match(fromsec, section_white_list))
1907 for (rel = start; rel < stop; rel++) {
1908 r.r_offset = TO_NATIVE(rel->r_offset);
1909 #if KERNEL_ELFCLASS == ELFCLASS64
1910 if (elf->hdr->e_machine == EM_MIPS) {
1912 r_sym = ELF64_MIPS_R_SYM(rel->r_info);
1913 r_sym = TO_NATIVE(r_sym);
1914 r_typ = ELF64_MIPS_R_TYPE(rel->r_info);
1915 r.r_info = ELF64_R_INFO(r_sym, r_typ);
1917 r.r_info = TO_NATIVE(rel->r_info);
1918 r_sym = ELF_R_SYM(r.r_info);
1921 r.r_info = TO_NATIVE(rel->r_info);
1922 r_sym = ELF_R_SYM(r.r_info);
1925 switch (elf->hdr->e_machine) {
1927 if (addend_386_rel(elf, sechdr, &r))
1931 if (addend_arm_rel(elf, sechdr, &r))
1935 if (addend_mips_rel(elf, sechdr, &r))
1939 sym = elf->symtab_start + r_sym;
1940 /* Skip special sections */
1941 if (is_shndx_special(sym->st_shndx))
1943 if (is_second_extable_reloc(start, rel, fromsec))
1944 find_extable_entry_size(fromsec, &r);
1945 check_section_mismatch(modname, elf, &r, sym, fromsec);
1950 * A module includes a number of sections that are discarded
1951 * either when loaded or when used as built-in.
1952 * For loaded modules all functions marked __init and all data
1953 * marked __initdata will be discarded when the module has been initialized.
1954 * Likewise for modules used built-in the sections marked __exit
1955 * are discarded because __exit marked function are supposed to be called
1956 * only when a module is unloaded which never happens for built-in modules.
1957 * The check_sec_ref() function traverses all relocation records
1958 * to find all references to a section that reference a section that will
1959 * be discarded and warns about it.
1961 static void check_sec_ref(struct module *mod, const char *modname,
1962 struct elf_info *elf)
1965 Elf_Shdr *sechdrs = elf->sechdrs;
1967 /* Walk through all sections */
1968 for (i = 0; i < elf->num_sections; i++) {
1969 check_section(modname, elf, &elf->sechdrs[i]);
1970 /* We want to process only relocation sections and not .init */
1971 if (sechdrs[i].sh_type == SHT_RELA)
1972 section_rela(modname, elf, &elf->sechdrs[i]);
1973 else if (sechdrs[i].sh_type == SHT_REL)
1974 section_rel(modname, elf, &elf->sechdrs[i]);
1978 static char *remove_dot(char *s)
1980 size_t n = strcspn(s, ".");
1983 size_t m = strspn(s + n + 1, "0123456789");
1984 if (m && (s[n + m] == '.' || s[n + m] == 0))
1990 static void read_symbols(const char *modname)
1992 const char *symname;
1997 struct elf_info info = { };
2000 if (!parse_elf(&info, modname))
2006 /* strip trailing .o */
2007 tmp = NOFAIL(strdup(modname));
2008 tmp[strlen(tmp) - 2] = '\0';
2009 mod = new_module(tmp);
2013 if (!mod->is_vmlinux) {
2014 license = get_modinfo(&info, "license");
2016 warn("missing MODULE_LICENSE() in %s\n", modname);
2018 if (license_is_gpl_compatible(license))
2019 mod->gpl_compatible = 1;
2021 mod->gpl_compatible = 0;
2024 license = get_next_modinfo(&info, "license", license);
2027 namespace = get_modinfo(&info, "import_ns");
2029 add_namespace(&mod->imported_namespaces, namespace);
2030 namespace = get_next_modinfo(&info, "import_ns",
2035 for (sym = info.symtab_start; sym < info.symtab_stop; sym++) {
2036 symname = remove_dot(info.strtab + sym->st_name);
2038 handle_symbol(mod, &info, sym, symname);
2039 handle_moddevtable(mod, &info, sym, symname);
2042 for (sym = info.symtab_start; sym < info.symtab_stop; sym++) {
2043 symname = remove_dot(info.strtab + sym->st_name);
2045 /* Apply symbol namespaces from __kstrtabns_<symbol> entries. */
2046 if (strstarts(symname, "__kstrtabns_"))
2047 sym_update_namespace(symname + strlen("__kstrtabns_"),
2048 namespace_from_kstrtabns(&info,
2051 if (strstarts(symname, "__crc_"))
2052 handle_modversion(mod, &info, sym,
2053 symname + strlen("__crc_"));
2056 // check for static EXPORT_SYMBOL_* functions && global vars
2057 for (sym = info.symtab_start; sym < info.symtab_stop; sym++) {
2058 unsigned char bind = ELF_ST_BIND(sym->st_info);
2060 if (bind == STB_GLOBAL || bind == STB_WEAK) {
2062 find_symbol(remove_dot(info.strtab +
2070 check_sec_ref(mod, modname, &info);
2072 if (!mod->is_vmlinux) {
2073 version = get_modinfo(&info, "version");
2074 if (version || all_versions)
2075 get_src_version(modname, mod->srcversion,
2076 sizeof(mod->srcversion) - 1);
2079 parse_elf_finish(&info);
2081 /* Our trick to get versioning for module struct etc. - it's
2082 * never passed as an argument to an exported function, so
2083 * the automatic versioning doesn't pick it up, but it's really
2084 * important anyhow */
2086 mod->unres = alloc_symbol("module_layout", 0, mod->unres);
2089 static void read_symbols_from_files(const char *filename)
2092 char fname[PATH_MAX];
2094 if (strcmp(filename, "-") != 0) {
2095 in = fopen(filename, "r");
2097 fatal("Can't open filenames file %s: %m", filename);
2100 while (fgets(fname, PATH_MAX, in) != NULL) {
2101 if (strends(fname, "\n"))
2102 fname[strlen(fname)-1] = '\0';
2103 read_symbols(fname);
2112 /* We first write the generated file into memory using the
2113 * following helper, then compare to the file on disk and
2114 * only update the later if anything changed */
2116 void __attribute__((format(printf, 2, 3))) buf_printf(struct buffer *buf,
2117 const char *fmt, ...)
2124 len = vsnprintf(tmp, SZ, fmt, ap);
2125 buf_write(buf, tmp, len);
2129 void buf_write(struct buffer *buf, const char *s, int len)
2131 if (buf->size - buf->pos < len) {
2132 buf->size += len + SZ;
2133 buf->p = NOFAIL(realloc(buf->p, buf->size));
2135 strncpy(buf->p + buf->pos, s, len);
2139 static void check_for_gpl_usage(enum export exp, const char *m, const char *s)
2143 fatal("GPL-incompatible module %s.ko uses GPL-only symbol '%s'\n",
2146 case export_unused_gpl:
2147 fatal("GPL-incompatible module %s.ko uses GPL-only symbol marked UNUSED '%s'\n",
2150 case export_gpl_future:
2151 warn("GPL-incompatible module %s.ko uses future GPL-only symbol '%s'\n",
2156 case export_unknown:
2162 static void check_for_unused(enum export exp, const char *m, const char *s)
2166 case export_unused_gpl:
2167 warn("module %s.ko uses symbol '%s' marked UNUSED\n",
2176 static int check_exports(struct module *mod)
2178 struct symbol *s, *exp;
2181 for (s = mod->unres; s; s = s->next) {
2182 const char *basename;
2183 exp = find_symbol(s->name);
2184 if (!exp || exp->module == mod) {
2185 if (have_vmlinux && !s->weak) {
2186 modpost_log(warn_unresolved ? LOG_WARN : LOG_ERROR,
2187 "\"%s\" [%s.ko] undefined!\n",
2188 s->name, mod->name);
2189 if (!warn_unresolved)
2194 basename = strrchr(mod->name, '/');
2198 basename = mod->name;
2200 if (exp->namespace &&
2201 !module_imports_namespace(mod, exp->namespace)) {
2202 modpost_log(allow_missing_ns_imports ? LOG_WARN : LOG_ERROR,
2203 "module %s uses symbol %s from namespace %s, but does not import it.\n",
2204 basename, exp->name, exp->namespace);
2205 if (!allow_missing_ns_imports)
2207 add_namespace(&mod->missing_namespaces, exp->namespace);
2210 if (!mod->gpl_compatible)
2211 check_for_gpl_usage(exp->export, basename, exp->name);
2212 check_for_unused(exp->export, basename, exp->name);
2218 static int check_modname_len(struct module *mod)
2220 const char *mod_name;
2222 mod_name = strrchr(mod->name, '/');
2223 if (mod_name == NULL)
2224 mod_name = mod->name;
2227 if (strlen(mod_name) >= MODULE_NAME_LEN) {
2228 merror("module name is too long [%s.ko]\n", mod->name);
2236 * Header for the generated file
2238 static void add_header(struct buffer *b, struct module *mod)
2240 buf_printf(b, "#include <linux/module.h>\n");
2242 * Include build-salt.h after module.h in order to
2243 * inherit the definitions.
2245 buf_printf(b, "#define INCLUDE_VERMAGIC\n");
2246 buf_printf(b, "#include <linux/build-salt.h>\n");
2247 buf_printf(b, "#include <linux/vermagic.h>\n");
2248 buf_printf(b, "#include <linux/compiler.h>\n");
2249 buf_printf(b, "\n");
2250 buf_printf(b, "BUILD_SALT;\n");
2251 buf_printf(b, "\n");
2252 buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n");
2253 buf_printf(b, "MODULE_INFO(name, KBUILD_MODNAME);\n");
2254 buf_printf(b, "\n");
2255 buf_printf(b, "__visible struct module __this_module\n");
2256 buf_printf(b, "__section(.gnu.linkonce.this_module) = {\n");
2257 buf_printf(b, "\t.name = KBUILD_MODNAME,\n");
2259 buf_printf(b, "\t.init = init_module,\n");
2260 if (mod->has_cleanup)
2261 buf_printf(b, "#ifdef CONFIG_MODULE_UNLOAD\n"
2262 "\t.exit = cleanup_module,\n"
2264 buf_printf(b, "\t.arch = MODULE_ARCH_INIT,\n");
2265 buf_printf(b, "};\n");
2268 static void add_intree_flag(struct buffer *b, int is_intree)
2271 buf_printf(b, "\nMODULE_INFO(intree, \"Y\");\n");
2274 /* Cannot check for assembler */
2275 static void add_retpoline(struct buffer *b)
2277 buf_printf(b, "\n#ifdef CONFIG_RETPOLINE\n");
2278 buf_printf(b, "MODULE_INFO(retpoline, \"Y\");\n");
2279 buf_printf(b, "#endif\n");
2282 static void add_staging_flag(struct buffer *b, const char *name)
2284 if (strstarts(name, "drivers/staging"))
2285 buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n");
2289 * Record CRCs for unresolved symbols
2291 static int add_versions(struct buffer *b, struct module *mod)
2293 struct symbol *s, *exp;
2296 for (s = mod->unres; s; s = s->next) {
2297 exp = find_symbol(s->name);
2298 if (!exp || exp->module == mod)
2300 s->module = exp->module;
2301 s->crc_valid = exp->crc_valid;
2308 buf_printf(b, "\n");
2309 buf_printf(b, "static const struct modversion_info ____versions[]\n");
2310 buf_printf(b, "__used __section(__versions) = {\n");
2312 for (s = mod->unres; s; s = s->next) {
2315 if (!s->crc_valid) {
2316 warn("\"%s\" [%s.ko] has no CRC!\n",
2317 s->name, mod->name);
2320 if (strlen(s->name) >= MODULE_NAME_LEN) {
2321 merror("too long symbol \"%s\" [%s.ko]\n",
2322 s->name, mod->name);
2326 buf_printf(b, "\t{ %#8x, \"%s\" },\n",
2330 buf_printf(b, "};\n");
2335 static void add_depends(struct buffer *b, struct module *mod)
2340 /* Clear ->seen flag of modules that own symbols needed by this. */
2341 for (s = mod->unres; s; s = s->next)
2343 s->module->seen = s->module->is_vmlinux;
2345 buf_printf(b, "\n");
2346 buf_printf(b, "MODULE_INFO(depends, \"");
2347 for (s = mod->unres; s; s = s->next) {
2352 if (s->module->seen)
2355 s->module->seen = 1;
2356 p = strrchr(s->module->name, '/');
2360 p = s->module->name;
2361 buf_printf(b, "%s%s", first ? "" : ",", p);
2364 buf_printf(b, "\");\n");
2367 static void add_srcversion(struct buffer *b, struct module *mod)
2369 if (mod->srcversion[0]) {
2370 buf_printf(b, "\n");
2371 buf_printf(b, "MODULE_INFO(srcversion, \"%s\");\n",
2376 static void write_buf(struct buffer *b, const char *fname)
2380 file = fopen(fname, "w");
2385 if (fwrite(b->p, 1, b->pos, file) != b->pos) {
2389 if (fclose(file) != 0) {
2395 static void write_if_changed(struct buffer *b, const char *fname)
2401 file = fopen(fname, "r");
2405 if (fstat(fileno(file), &st) < 0)
2408 if (st.st_size != b->pos)
2411 tmp = NOFAIL(malloc(b->pos));
2412 if (fread(tmp, 1, b->pos, file) != b->pos)
2415 if (memcmp(tmp, b->p, b->pos) != 0)
2427 write_buf(b, fname);
2430 /* parse Module.symvers file. line format:
2431 * 0x12345678<tab>symbol<tab>module<tab>export<tab>namespace
2433 static void read_dump(const char *fname)
2435 char *buf, *pos, *line;
2437 buf = read_text_file(fname);
2439 /* No symbol versions, silently ignore */
2444 while ((line = get_line(&pos))) {
2445 char *symname, *namespace, *modname, *d, *export;
2450 if (!(symname = strchr(line, '\t')))
2453 if (!(modname = strchr(symname, '\t')))
2456 if (!(export = strchr(modname, '\t')))
2459 if (!(namespace = strchr(export, '\t')))
2461 *namespace++ = '\0';
2463 crc = strtoul(line, &d, 16);
2464 if (*symname == '\0' || *modname == '\0' || *d != '\0')
2466 mod = find_module(modname);
2468 mod = new_module(modname);
2471 s = sym_add_exported(symname, mod, export_no(export));
2473 sym_set_crc(symname, crc);
2474 sym_update_namespace(symname, namespace);
2480 fatal("parse error in symbol dump file\n");
2483 /* For normal builds always dump all symbols.
2484 * For external modules only dump symbols
2485 * that are not read from kernel Module.symvers.
2487 static int dump_sym(struct symbol *sym)
2489 if (!external_module)
2491 if (sym->module->from_dump)
2496 static void write_dump(const char *fname)
2498 struct buffer buf = { };
2499 struct symbol *symbol;
2500 const char *namespace;
2503 for (n = 0; n < SYMBOL_HASH_SIZE ; n++) {
2504 symbol = symbolhash[n];
2506 if (dump_sym(symbol)) {
2507 namespace = symbol->namespace;
2508 buf_printf(&buf, "0x%08x\t%s\t%s\t%s\t%s\n",
2509 symbol->crc, symbol->name,
2510 symbol->module->name,
2511 export_str(symbol->export),
2512 namespace ? namespace : "");
2514 symbol = symbol->next;
2517 write_buf(&buf, fname);
2521 static void write_namespace_deps_files(const char *fname)
2524 struct namespace_list *ns;
2525 struct buffer ns_deps_buf = {};
2527 for (mod = modules; mod; mod = mod->next) {
2529 if (mod->from_dump || !mod->missing_namespaces)
2532 buf_printf(&ns_deps_buf, "%s.ko:", mod->name);
2534 for (ns = mod->missing_namespaces; ns; ns = ns->next)
2535 buf_printf(&ns_deps_buf, " %s", ns->namespace);
2537 buf_printf(&ns_deps_buf, "\n");
2540 write_if_changed(&ns_deps_buf, fname);
2541 free(ns_deps_buf.p);
2545 struct dump_list *next;
2549 int main(int argc, char **argv)
2552 struct buffer buf = { };
2553 char *missing_namespace_deps = NULL;
2554 char *dump_write = NULL, *files_source = NULL;
2558 struct dump_list *dump_read_start = NULL;
2559 struct dump_list **dump_read_iter = &dump_read_start;
2561 while ((opt = getopt(argc, argv, "ei:mnT:o:awENd:")) != -1) {
2564 external_module = 1;
2568 NOFAIL(calloc(1, sizeof(**dump_read_iter)));
2569 (*dump_read_iter)->file = optarg;
2570 dump_read_iter = &(*dump_read_iter)->next;
2576 ignore_missing_files = 1;
2579 dump_write = optarg;
2585 files_source = optarg;
2588 warn_unresolved = 1;
2591 sec_mismatch_fatal = 1;
2594 allow_missing_ns_imports = 1;
2597 missing_namespace_deps = optarg;
2604 while (dump_read_start) {
2605 struct dump_list *tmp;
2607 read_dump(dump_read_start->file);
2608 tmp = dump_read_start->next;
2609 free(dump_read_start);
2610 dump_read_start = tmp;
2613 while (optind < argc)
2614 read_symbols(argv[optind++]);
2617 read_symbols_from_files(files_source);
2620 * When there's no vmlinux, don't print warnings about
2621 * unresolved symbols (since there'll be too many ;)
2624 warn("Symbol info of vmlinux is missing. Unresolved symbol check will be entirely skipped.\n");
2628 for (mod = modules; mod; mod = mod->next) {
2629 char fname[PATH_MAX];
2631 if (mod->is_vmlinux || mod->from_dump)
2636 err |= check_modname_len(mod);
2637 err |= check_exports(mod);
2639 add_header(&buf, mod);
2640 add_intree_flag(&buf, !external_module);
2641 add_retpoline(&buf);
2642 add_staging_flag(&buf, mod->name);
2643 err |= add_versions(&buf, mod);
2644 add_depends(&buf, mod);
2645 add_moddevtable(&buf, mod);
2646 add_srcversion(&buf, mod);
2648 sprintf(fname, "%s.mod.c", mod->name);
2649 write_if_changed(&buf, fname);
2652 if (missing_namespace_deps)
2653 write_namespace_deps_files(missing_namespace_deps);
2656 write_dump(dump_write);
2657 if (sec_mismatch_count && sec_mismatch_fatal)
2658 fatal("Section mismatches detected.\n"
2659 "Set CONFIG_SECTION_MISMATCH_WARN_ONLY=y to allow them.\n");
2660 for (n = 0; n < SYMBOL_HASH_SIZE; n++) {
2663 for (s = symbolhash[n]; s; s = s->next) {
2665 warn("\"%s\" [%s] is a static %s\n",
2666 s->name, s->module->name,
2667 export_str(s->export));