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 /* Warn about section mismatch in vmlinux if set to 1 */
34 static int vmlinux_section_warnings = 1;
35 /* Only warn about unresolved symbols */
36 static int warn_unresolved = 0;
37 /* How a symbol is exported */
38 static int sec_mismatch_count = 0;
39 static int sec_mismatch_fatal = 0;
40 /* ignore missing files */
41 static int ignore_missing_files;
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 #define PRINTF __attribute__ ((format (printf, 1, 2)))
56 PRINTF void fatal(const char *fmt, ...)
60 fprintf(stderr, "FATAL: ");
62 va_start(arglist, fmt);
63 vfprintf(stderr, fmt, arglist);
69 PRINTF void warn(const char *fmt, ...)
73 fprintf(stderr, "WARNING: ");
75 va_start(arglist, fmt);
76 vfprintf(stderr, fmt, arglist);
80 PRINTF void merror(const char *fmt, ...)
84 fprintf(stderr, "ERROR: ");
86 va_start(arglist, fmt);
87 vfprintf(stderr, fmt, arglist);
91 static inline bool strends(const char *str, const char *postfix)
93 if (strlen(str) < strlen(postfix))
96 return strcmp(str + strlen(str) - strlen(postfix), postfix) == 0;
99 static int is_vmlinux(const char *modname)
103 myname = strrchr(modname, '/');
109 return (strcmp(myname, "vmlinux") == 0) ||
110 (strcmp(myname, "vmlinux.o") == 0);
113 void *do_nofail(void *ptr, const char *expr)
116 fatal("modpost: Memory allocation failure: %s.\n", expr);
121 /* A list of all modules we processed */
122 static struct module *modules;
124 static struct module *find_module(const char *modname)
128 for (mod = modules; mod; mod = mod->next)
129 if (strcmp(mod->name, modname) == 0)
134 static struct module *new_module(const char *modname)
139 mod = NOFAIL(malloc(sizeof(*mod)));
140 memset(mod, 0, sizeof(*mod));
141 p = NOFAIL(strdup(modname));
143 /* strip trailing .o */
144 if (strends(p, ".o")) {
145 p[strlen(p) - 2] = '\0';
151 mod->gpl_compatible = -1;
158 /* A hash of all exported symbols,
159 * struct symbol is also used for lists of unresolved symbols */
161 #define SYMBOL_HASH_SIZE 1024
165 struct module *module;
170 unsigned int vmlinux:1; /* 1 if symbol is defined in vmlinux */
171 unsigned int kernel:1; /* 1 if symbol is from kernel
172 * (only for external modules) **/
173 unsigned int is_static:1; /* 1 if symbol is not global */
174 enum export export; /* Type of export */
178 static struct symbol *symbolhash[SYMBOL_HASH_SIZE];
180 /* This is based on the hash agorithm from gdbm, via tdb */
181 static inline unsigned int tdb_hash(const char *name)
183 unsigned value; /* Used to compute the hash value. */
184 unsigned i; /* Used to cycle through random values. */
186 /* Set the initial value from the key size. */
187 for (value = 0x238F13AF * strlen(name), i = 0; name[i]; i++)
188 value = (value + (((unsigned char *)name)[i] << (i*5 % 24)));
190 return (1103515243 * value + 12345);
194 * Allocate a new symbols for use in the hash of exported symbols or
195 * the list of unresolved symbols per module
197 static struct symbol *alloc_symbol(const char *name, unsigned int weak,
200 struct symbol *s = NOFAIL(malloc(sizeof(*s) + strlen(name) + 1));
202 memset(s, 0, sizeof(*s));
203 strcpy(s->name, name);
210 /* For the hash of exported symbols */
211 static struct symbol *new_symbol(const char *name, struct module *module,
216 hash = tdb_hash(name) % SYMBOL_HASH_SIZE;
217 symbolhash[hash] = alloc_symbol(name, 0, symbolhash[hash]);
219 return symbolhash[hash];
222 static struct symbol *find_symbol(const char *name)
226 /* For our purposes, .foo matches foo. PPC64 needs this. */
230 for (s = symbolhash[tdb_hash(name) % SYMBOL_HASH_SIZE]; s; s = s->next) {
231 if (strcmp(s->name, name) == 0)
237 static bool contains_namespace(struct namespace_list *list,
238 const char *namespace)
240 for (; list; list = list->next)
241 if (!strcmp(list->namespace, namespace))
247 static void add_namespace(struct namespace_list **list, const char *namespace)
249 struct namespace_list *ns_entry;
251 if (!contains_namespace(*list, namespace)) {
252 ns_entry = NOFAIL(malloc(sizeof(struct namespace_list) +
253 strlen(namespace) + 1));
254 strcpy(ns_entry->namespace, namespace);
255 ns_entry->next = *list;
260 static bool module_imports_namespace(struct module *module,
261 const char *namespace)
263 return contains_namespace(module->imported_namespaces, namespace);
266 static const struct {
270 { .str = "EXPORT_SYMBOL", .export = export_plain },
271 { .str = "EXPORT_UNUSED_SYMBOL", .export = export_unused },
272 { .str = "EXPORT_SYMBOL_GPL", .export = export_gpl },
273 { .str = "EXPORT_UNUSED_SYMBOL_GPL", .export = export_unused_gpl },
274 { .str = "EXPORT_SYMBOL_GPL_FUTURE", .export = export_gpl_future },
275 { .str = "(unknown)", .export = export_unknown },
279 static const char *export_str(enum export ex)
281 return export_list[ex].str;
284 static enum export export_no(const char *s)
289 return export_unknown;
290 for (i = 0; export_list[i].export != export_unknown; i++) {
291 if (strcmp(export_list[i].str, s) == 0)
292 return export_list[i].export;
294 return export_unknown;
297 static const char *sech_name(struct elf_info *elf, Elf_Shdr *sechdr)
299 return (void *)elf->hdr +
300 elf->sechdrs[elf->secindex_strings].sh_offset +
304 static const char *sec_name(struct elf_info *elf, int secindex)
306 return sech_name(elf, &elf->sechdrs[secindex]);
309 static void *sym_get_data(const struct elf_info *info, const Elf_Sym *sym)
311 Elf_Shdr *sechdr = &info->sechdrs[sym->st_shndx];
312 unsigned long offset;
314 offset = sym->st_value;
315 if (info->hdr->e_type != ET_REL)
316 offset -= sechdr->sh_addr;
318 return (void *)info->hdr + sechdr->sh_offset + offset;
321 #define strstarts(str, prefix) (strncmp(str, prefix, strlen(prefix)) == 0)
323 static enum export export_from_secname(struct elf_info *elf, unsigned int sec)
325 const char *secname = sec_name(elf, sec);
327 if (strstarts(secname, "___ksymtab+"))
329 else if (strstarts(secname, "___ksymtab_unused+"))
330 return export_unused;
331 else if (strstarts(secname, "___ksymtab_gpl+"))
333 else if (strstarts(secname, "___ksymtab_unused_gpl+"))
334 return export_unused_gpl;
335 else if (strstarts(secname, "___ksymtab_gpl_future+"))
336 return export_gpl_future;
338 return export_unknown;
341 static enum export export_from_sec(struct elf_info *elf, unsigned int sec)
343 if (sec == elf->export_sec)
345 else if (sec == elf->export_unused_sec)
346 return export_unused;
347 else if (sec == elf->export_gpl_sec)
349 else if (sec == elf->export_unused_gpl_sec)
350 return export_unused_gpl;
351 else if (sec == elf->export_gpl_future_sec)
352 return export_gpl_future;
354 return export_unknown;
357 static const char *namespace_from_kstrtabns(const struct elf_info *info,
360 const char *value = sym_get_data(info, sym);
361 return value[0] ? value : NULL;
364 static void sym_update_namespace(const char *symname, const char *namespace)
366 struct symbol *s = find_symbol(symname);
369 * That symbol should have been created earlier and thus this is
370 * actually an assertion.
373 merror("Could not update namespace(%s) for symbol %s\n",
380 namespace && namespace[0] ? NOFAIL(strdup(namespace)) : NULL;
384 * Add an exported symbol - it may have already been added without a
385 * CRC, in this case just update the CRC
387 static struct symbol *sym_add_exported(const char *name, struct module *mod,
390 struct symbol *s = find_symbol(name);
393 s = new_symbol(name, mod, export);
394 } else if (!external_module || is_vmlinux(s->module->name) ||
396 warn("%s: '%s' exported twice. Previous export was in %s%s\n",
397 mod->name, name, s->module->name,
398 is_vmlinux(s->module->name) ? "" : ".ko");
403 s->vmlinux = is_vmlinux(mod->name);
409 static void sym_set_crc(const char *name, unsigned int crc)
411 struct symbol *s = find_symbol(name);
414 * Ignore stand-alone __crc_*, which might be auto-generated symbols
415 * such as __*_veneer in ARM ELF.
424 void *grab_file(const char *filename, unsigned long *size)
427 void *map = MAP_FAILED;
430 fd = open(filename, O_RDONLY);
437 map = mmap(NULL, *size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
441 if (map == MAP_FAILED)
447 * Return a copy of the next line in a mmap'ed file.
448 * spaces in the beginning of the line is trimmed away.
449 * Return a pointer to a static buffer.
451 char *get_next_line(unsigned long *pos, void *file, unsigned long size)
453 static char line[4096];
456 signed char *p = (signed char *)file + *pos;
459 for (; *pos < size ; (*pos)++) {
460 if (skip && isspace(*p)) {
465 if (*p != '\n' && (*pos < size)) {
469 break; /* Too long, stop */
480 void release_file(void *file, unsigned long size)
485 static int parse_elf(struct elf_info *info, const char *filename)
491 const char *secstrings;
492 unsigned int symtab_idx = ~0U, symtab_shndx_idx = ~0U;
494 hdr = grab_file(filename, &info->size);
496 if (ignore_missing_files) {
497 fprintf(stderr, "%s: %s (ignored)\n", filename,
505 if (info->size < sizeof(*hdr)) {
506 /* file too small, assume this is an empty .o file */
509 /* Is this a valid ELF file? */
510 if ((hdr->e_ident[EI_MAG0] != ELFMAG0) ||
511 (hdr->e_ident[EI_MAG1] != ELFMAG1) ||
512 (hdr->e_ident[EI_MAG2] != ELFMAG2) ||
513 (hdr->e_ident[EI_MAG3] != ELFMAG3)) {
514 /* Not an ELF file - silently ignore it */
517 /* Fix endianness in ELF header */
518 hdr->e_type = TO_NATIVE(hdr->e_type);
519 hdr->e_machine = TO_NATIVE(hdr->e_machine);
520 hdr->e_version = TO_NATIVE(hdr->e_version);
521 hdr->e_entry = TO_NATIVE(hdr->e_entry);
522 hdr->e_phoff = TO_NATIVE(hdr->e_phoff);
523 hdr->e_shoff = TO_NATIVE(hdr->e_shoff);
524 hdr->e_flags = TO_NATIVE(hdr->e_flags);
525 hdr->e_ehsize = TO_NATIVE(hdr->e_ehsize);
526 hdr->e_phentsize = TO_NATIVE(hdr->e_phentsize);
527 hdr->e_phnum = TO_NATIVE(hdr->e_phnum);
528 hdr->e_shentsize = TO_NATIVE(hdr->e_shentsize);
529 hdr->e_shnum = TO_NATIVE(hdr->e_shnum);
530 hdr->e_shstrndx = TO_NATIVE(hdr->e_shstrndx);
531 sechdrs = (void *)hdr + hdr->e_shoff;
532 info->sechdrs = sechdrs;
534 /* Check if file offset is correct */
535 if (hdr->e_shoff > info->size) {
536 fatal("section header offset=%lu in file '%s' is bigger than "
537 "filesize=%lu\n", (unsigned long)hdr->e_shoff,
538 filename, info->size);
542 if (hdr->e_shnum == SHN_UNDEF) {
544 * There are more than 64k sections,
545 * read count from .sh_size.
547 info->num_sections = TO_NATIVE(sechdrs[0].sh_size);
550 info->num_sections = hdr->e_shnum;
552 if (hdr->e_shstrndx == SHN_XINDEX) {
553 info->secindex_strings = TO_NATIVE(sechdrs[0].sh_link);
556 info->secindex_strings = hdr->e_shstrndx;
559 /* Fix endianness in section headers */
560 for (i = 0; i < info->num_sections; i++) {
561 sechdrs[i].sh_name = TO_NATIVE(sechdrs[i].sh_name);
562 sechdrs[i].sh_type = TO_NATIVE(sechdrs[i].sh_type);
563 sechdrs[i].sh_flags = TO_NATIVE(sechdrs[i].sh_flags);
564 sechdrs[i].sh_addr = TO_NATIVE(sechdrs[i].sh_addr);
565 sechdrs[i].sh_offset = TO_NATIVE(sechdrs[i].sh_offset);
566 sechdrs[i].sh_size = TO_NATIVE(sechdrs[i].sh_size);
567 sechdrs[i].sh_link = TO_NATIVE(sechdrs[i].sh_link);
568 sechdrs[i].sh_info = TO_NATIVE(sechdrs[i].sh_info);
569 sechdrs[i].sh_addralign = TO_NATIVE(sechdrs[i].sh_addralign);
570 sechdrs[i].sh_entsize = TO_NATIVE(sechdrs[i].sh_entsize);
572 /* Find symbol table. */
573 secstrings = (void *)hdr + sechdrs[info->secindex_strings].sh_offset;
574 for (i = 1; i < info->num_sections; i++) {
576 int nobits = sechdrs[i].sh_type == SHT_NOBITS;
578 if (!nobits && sechdrs[i].sh_offset > info->size) {
579 fatal("%s is truncated. sechdrs[i].sh_offset=%lu > "
580 "sizeof(*hrd)=%zu\n", filename,
581 (unsigned long)sechdrs[i].sh_offset,
585 secname = secstrings + sechdrs[i].sh_name;
586 if (strcmp(secname, ".modinfo") == 0) {
588 fatal("%s has NOBITS .modinfo\n", filename);
589 info->modinfo = (void *)hdr + sechdrs[i].sh_offset;
590 info->modinfo_len = sechdrs[i].sh_size;
591 } else if (strcmp(secname, "__ksymtab") == 0)
592 info->export_sec = i;
593 else if (strcmp(secname, "__ksymtab_unused") == 0)
594 info->export_unused_sec = i;
595 else if (strcmp(secname, "__ksymtab_gpl") == 0)
596 info->export_gpl_sec = i;
597 else if (strcmp(secname, "__ksymtab_unused_gpl") == 0)
598 info->export_unused_gpl_sec = i;
599 else if (strcmp(secname, "__ksymtab_gpl_future") == 0)
600 info->export_gpl_future_sec = i;
602 if (sechdrs[i].sh_type == SHT_SYMTAB) {
603 unsigned int sh_link_idx;
605 info->symtab_start = (void *)hdr +
606 sechdrs[i].sh_offset;
607 info->symtab_stop = (void *)hdr +
608 sechdrs[i].sh_offset + sechdrs[i].sh_size;
609 sh_link_idx = sechdrs[i].sh_link;
610 info->strtab = (void *)hdr +
611 sechdrs[sh_link_idx].sh_offset;
614 /* 32bit section no. table? ("more than 64k sections") */
615 if (sechdrs[i].sh_type == SHT_SYMTAB_SHNDX) {
616 symtab_shndx_idx = i;
617 info->symtab_shndx_start = (void *)hdr +
618 sechdrs[i].sh_offset;
619 info->symtab_shndx_stop = (void *)hdr +
620 sechdrs[i].sh_offset + sechdrs[i].sh_size;
623 if (!info->symtab_start)
624 fatal("%s has no symtab?\n", filename);
626 /* Fix endianness in symbols */
627 for (sym = info->symtab_start; sym < info->symtab_stop; sym++) {
628 sym->st_shndx = TO_NATIVE(sym->st_shndx);
629 sym->st_name = TO_NATIVE(sym->st_name);
630 sym->st_value = TO_NATIVE(sym->st_value);
631 sym->st_size = TO_NATIVE(sym->st_size);
634 if (symtab_shndx_idx != ~0U) {
636 if (symtab_idx != sechdrs[symtab_shndx_idx].sh_link)
637 fatal("%s: SYMTAB_SHNDX has bad sh_link: %u!=%u\n",
638 filename, sechdrs[symtab_shndx_idx].sh_link,
641 for (p = info->symtab_shndx_start; p < info->symtab_shndx_stop;
649 static void parse_elf_finish(struct elf_info *info)
651 release_file(info->hdr, info->size);
654 static int ignore_undef_symbol(struct elf_info *info, const char *symname)
656 /* ignore __this_module, it will be resolved shortly */
657 if (strcmp(symname, "__this_module") == 0)
659 /* ignore global offset table */
660 if (strcmp(symname, "_GLOBAL_OFFSET_TABLE_") == 0)
662 if (info->hdr->e_machine == EM_PPC)
663 /* Special register function linked on all modules during final link of .ko */
664 if (strstarts(symname, "_restgpr_") ||
665 strstarts(symname, "_savegpr_") ||
666 strstarts(symname, "_rest32gpr_") ||
667 strstarts(symname, "_save32gpr_") ||
668 strstarts(symname, "_restvr_") ||
669 strstarts(symname, "_savevr_"))
671 if (info->hdr->e_machine == EM_PPC64)
672 /* Special register function linked on all modules during final link of .ko */
673 if (strstarts(symname, "_restgpr0_") ||
674 strstarts(symname, "_savegpr0_") ||
675 strstarts(symname, "_restvr_") ||
676 strstarts(symname, "_savevr_") ||
677 strcmp(symname, ".TOC.") == 0)
679 /* Do not ignore this symbol */
683 static void handle_modversion(const struct module *mod,
684 const struct elf_info *info,
685 const Elf_Sym *sym, const char *symname)
689 if (sym->st_shndx == SHN_UNDEF) {
690 warn("EXPORT symbol \"%s\" [%s%s] version generation failed, symbol will not be versioned.\n",
691 symname, mod->name, is_vmlinux(mod->name) ? "":".ko");
695 if (sym->st_shndx == SHN_ABS) {
700 /* symbol points to the CRC in the ELF object */
701 crcp = sym_get_data(info, sym);
702 crc = TO_NATIVE(*crcp);
704 sym_set_crc(symname, crc);
707 static void handle_symbol(struct module *mod, struct elf_info *info,
708 const Elf_Sym *sym, const char *symname)
713 if ((!is_vmlinux(mod->name) || mod->is_dot_o) &&
714 strstarts(symname, "__ksymtab"))
715 export = export_from_secname(info, get_secindex(info, sym));
717 export = export_from_sec(info, get_secindex(info, sym));
719 switch (sym->st_shndx) {
721 if (strstarts(symname, "__gnu_lto_")) {
722 /* Should warn here, but modpost runs before the linker */
724 warn("\"%s\" [%s] is COMMON symbol\n", symname, mod->name);
727 /* undefined symbol */
728 if (ELF_ST_BIND(sym->st_info) != STB_GLOBAL &&
729 ELF_ST_BIND(sym->st_info) != STB_WEAK)
731 if (ignore_undef_symbol(info, symname))
733 if (info->hdr->e_machine == EM_SPARC ||
734 info->hdr->e_machine == EM_SPARCV9) {
735 /* Ignore register directives. */
736 if (ELF_ST_TYPE(sym->st_info) == STT_SPARC_REGISTER)
738 if (symname[0] == '.') {
739 char *munged = NOFAIL(strdup(symname));
741 munged[1] = toupper(munged[1]);
746 mod->unres = alloc_symbol(symname,
747 ELF_ST_BIND(sym->st_info) == STB_WEAK,
751 /* All exported symbols */
752 if (strstarts(symname, "__ksymtab_")) {
753 name = symname + strlen("__ksymtab_");
754 sym_add_exported(name, mod, export);
756 if (strcmp(symname, "init_module") == 0)
758 if (strcmp(symname, "cleanup_module") == 0)
759 mod->has_cleanup = 1;
765 * Parse tag=value strings from .modinfo section
767 static char *next_string(char *string, unsigned long *secsize)
769 /* Skip non-zero chars */
772 if ((*secsize)-- <= 1)
776 /* Skip any zero padding. */
779 if ((*secsize)-- <= 1)
785 static char *get_next_modinfo(struct elf_info *info, const char *tag,
789 unsigned int taglen = strlen(tag);
790 char *modinfo = info->modinfo;
791 unsigned long size = info->modinfo_len;
794 size -= prev - modinfo;
795 modinfo = next_string(prev, &size);
798 for (p = modinfo; p; p = next_string(p, &size)) {
799 if (strncmp(p, tag, taglen) == 0 && p[taglen] == '=')
800 return p + taglen + 1;
805 static char *get_modinfo(struct elf_info *info, const char *tag)
808 return get_next_modinfo(info, tag, NULL);
812 * Test if string s ends in string sub
815 static int strrcmp(const char *s, const char *sub)
823 sublen = strlen(sub);
825 if ((slen == 0) || (sublen == 0))
831 return memcmp(s + slen - sublen, sub, sublen);
834 static const char *sym_name(struct elf_info *elf, Elf_Sym *sym)
837 return elf->strtab + sym->st_name;
842 /* The pattern is an array of simple patterns.
843 * "foo" will match an exact string equal to "foo"
844 * "*foo" will match a string that ends with "foo"
845 * "foo*" will match a string that begins with "foo"
846 * "*foo*" will match a string that contains "foo"
848 static int match(const char *sym, const char * const pat[])
853 const char *endp = p + strlen(p) - 1;
856 if (*p == '*' && *endp == '*') {
857 char *bare = NOFAIL(strndup(p + 1, strlen(p) - 2));
858 char *here = strstr(sym, bare);
865 else if (*p == '*') {
866 if (strrcmp(sym, p + 1) == 0)
870 else if (*endp == '*') {
871 if (strncmp(sym, p, strlen(p) - 1) == 0)
876 if (strcmp(p, sym) == 0)
884 /* sections that we do not want to do full section mismatch check on */
885 static const char *const section_white_list[] =
889 ".cranges", /* sh64 */
890 ".zdebug*", /* Compressed debug sections. */
891 ".GCC.command.line", /* record-gcc-switches */
892 ".mdebug*", /* alpha, score, mips etc. */
893 ".pdr", /* alpha, score, mips etc. */
898 ".xt.prop", /* xtensa */
899 ".xt.lit", /* xtensa */
900 ".arcextmap*", /* arc */
901 ".gnu.linkonce.arcext*", /* arc : modules */
902 ".cmem*", /* EZchip */
903 ".fmt_slot*", /* EZchip */
910 * This is used to find sections missing the SHF_ALLOC flag.
911 * The cause of this is often a section specified in assembler
912 * without "ax" / "aw".
914 static void check_section(const char *modname, struct elf_info *elf,
917 const char *sec = sech_name(elf, sechdr);
919 if (sechdr->sh_type == SHT_PROGBITS &&
920 !(sechdr->sh_flags & SHF_ALLOC) &&
921 !match(sec, section_white_list)) {
922 warn("%s (%s): unexpected non-allocatable section.\n"
923 "Did you forget to use \"ax\"/\"aw\" in a .S file?\n"
924 "Note that for example <linux/init.h> contains\n"
925 "section definitions for use in .S files.\n\n",
932 #define ALL_INIT_DATA_SECTIONS \
933 ".init.setup", ".init.rodata", ".meminit.rodata", \
934 ".init.data", ".meminit.data"
935 #define ALL_EXIT_DATA_SECTIONS \
936 ".exit.data", ".memexit.data"
938 #define ALL_INIT_TEXT_SECTIONS \
939 ".init.text", ".meminit.text"
940 #define ALL_EXIT_TEXT_SECTIONS \
941 ".exit.text", ".memexit.text"
943 #define ALL_PCI_INIT_SECTIONS \
944 ".pci_fixup_early", ".pci_fixup_header", ".pci_fixup_final", \
945 ".pci_fixup_enable", ".pci_fixup_resume", \
946 ".pci_fixup_resume_early", ".pci_fixup_suspend"
948 #define ALL_XXXINIT_SECTIONS MEM_INIT_SECTIONS
949 #define ALL_XXXEXIT_SECTIONS MEM_EXIT_SECTIONS
951 #define ALL_INIT_SECTIONS INIT_SECTIONS, ALL_XXXINIT_SECTIONS
952 #define ALL_EXIT_SECTIONS EXIT_SECTIONS, ALL_XXXEXIT_SECTIONS
954 #define DATA_SECTIONS ".data", ".data.rel"
955 #define TEXT_SECTIONS ".text", ".text.unlikely", ".sched.text", \
956 ".kprobes.text", ".cpuidle.text"
957 #define OTHER_TEXT_SECTIONS ".ref.text", ".head.text", ".spinlock.text", \
958 ".fixup", ".entry.text", ".exception.text", ".text.*", \
961 #define INIT_SECTIONS ".init.*"
962 #define MEM_INIT_SECTIONS ".meminit.*"
964 #define EXIT_SECTIONS ".exit.*"
965 #define MEM_EXIT_SECTIONS ".memexit.*"
967 #define ALL_TEXT_SECTIONS ALL_INIT_TEXT_SECTIONS, ALL_EXIT_TEXT_SECTIONS, \
968 TEXT_SECTIONS, OTHER_TEXT_SECTIONS
970 /* init data sections */
971 static const char *const init_data_sections[] =
972 { ALL_INIT_DATA_SECTIONS, NULL };
974 /* all init sections */
975 static const char *const init_sections[] = { ALL_INIT_SECTIONS, NULL };
977 /* All init and exit sections (code + data) */
978 static const char *const init_exit_sections[] =
979 {ALL_INIT_SECTIONS, ALL_EXIT_SECTIONS, NULL };
981 /* all text sections */
982 static const char *const text_sections[] = { ALL_TEXT_SECTIONS, NULL };
985 static const char *const data_sections[] = { DATA_SECTIONS, NULL };
988 /* symbols in .data that may refer to init/exit sections */
989 #define DEFAULT_SYMBOL_WHITE_LIST \
991 "*_template", /* scsi uses *_template a lot */ \
992 "*_timer", /* arm uses ops structures named _timer a lot */ \
993 "*_sht", /* scsi also used *_sht to some extent */ \
999 static const char *const head_sections[] = { ".head.text*", NULL };
1000 static const char *const linker_symbols[] =
1001 { "__init_begin", "_sinittext", "_einittext", NULL };
1002 static const char *const optim_symbols[] = { "*.constprop.*", NULL };
1009 XXXINIT_TO_SOME_INIT,
1010 XXXEXIT_TO_SOME_EXIT,
1011 ANY_INIT_TO_ANY_EXIT,
1012 ANY_EXIT_TO_ANY_INIT,
1013 EXPORT_TO_INIT_EXIT,
1014 EXTABLE_TO_NON_TEXT,
1018 * Describe how to match sections on different criterias:
1020 * @fromsec: Array of sections to be matched.
1022 * @bad_tosec: Relocations applied to a section in @fromsec to a section in
1023 * this array is forbidden (black-list). Can be empty.
1025 * @good_tosec: Relocations applied to a section in @fromsec must be
1026 * targetting sections in this array (white-list). Can be empty.
1028 * @mismatch: Type of mismatch.
1030 * @symbol_white_list: Do not match a relocation to a symbol in this list
1031 * even if it is targetting a section in @bad_to_sec.
1033 * @handler: Specific handler to call when a match is found. If NULL,
1034 * default_mismatch_handler() will be called.
1037 struct sectioncheck {
1038 const char *fromsec[20];
1039 const char *bad_tosec[20];
1040 const char *good_tosec[20];
1041 enum mismatch mismatch;
1042 const char *symbol_white_list[20];
1043 void (*handler)(const char *modname, struct elf_info *elf,
1044 const struct sectioncheck* const mismatch,
1045 Elf_Rela *r, Elf_Sym *sym, const char *fromsec);
1049 static void extable_mismatch_handler(const char *modname, struct elf_info *elf,
1050 const struct sectioncheck* const mismatch,
1051 Elf_Rela *r, Elf_Sym *sym,
1052 const char *fromsec);
1054 static const struct sectioncheck sectioncheck[] = {
1055 /* Do not reference init/exit code/data from
1056 * normal code and data
1059 .fromsec = { TEXT_SECTIONS, NULL },
1060 .bad_tosec = { ALL_INIT_SECTIONS, NULL },
1061 .mismatch = TEXT_TO_ANY_INIT,
1062 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1065 .fromsec = { DATA_SECTIONS, NULL },
1066 .bad_tosec = { ALL_XXXINIT_SECTIONS, NULL },
1067 .mismatch = DATA_TO_ANY_INIT,
1068 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1071 .fromsec = { DATA_SECTIONS, NULL },
1072 .bad_tosec = { INIT_SECTIONS, NULL },
1073 .mismatch = DATA_TO_ANY_INIT,
1074 .symbol_white_list = {
1075 "*_template", "*_timer", "*_sht", "*_ops",
1076 "*_probe", "*_probe_one", "*_console", NULL
1080 .fromsec = { TEXT_SECTIONS, NULL },
1081 .bad_tosec = { ALL_EXIT_SECTIONS, NULL },
1082 .mismatch = TEXT_TO_ANY_EXIT,
1083 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1086 .fromsec = { DATA_SECTIONS, NULL },
1087 .bad_tosec = { ALL_EXIT_SECTIONS, NULL },
1088 .mismatch = DATA_TO_ANY_EXIT,
1089 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1091 /* Do not reference init code/data from meminit code/data */
1093 .fromsec = { ALL_XXXINIT_SECTIONS, NULL },
1094 .bad_tosec = { INIT_SECTIONS, NULL },
1095 .mismatch = XXXINIT_TO_SOME_INIT,
1096 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1098 /* Do not reference exit code/data from memexit code/data */
1100 .fromsec = { ALL_XXXEXIT_SECTIONS, NULL },
1101 .bad_tosec = { EXIT_SECTIONS, NULL },
1102 .mismatch = XXXEXIT_TO_SOME_EXIT,
1103 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1105 /* Do not use exit code/data from init code */
1107 .fromsec = { ALL_INIT_SECTIONS, NULL },
1108 .bad_tosec = { ALL_EXIT_SECTIONS, NULL },
1109 .mismatch = ANY_INIT_TO_ANY_EXIT,
1110 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1112 /* Do not use init code/data from exit code */
1114 .fromsec = { ALL_EXIT_SECTIONS, NULL },
1115 .bad_tosec = { ALL_INIT_SECTIONS, NULL },
1116 .mismatch = ANY_EXIT_TO_ANY_INIT,
1117 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1120 .fromsec = { ALL_PCI_INIT_SECTIONS, NULL },
1121 .bad_tosec = { INIT_SECTIONS, NULL },
1122 .mismatch = ANY_INIT_TO_ANY_EXIT,
1123 .symbol_white_list = { NULL },
1125 /* Do not export init/exit functions or data */
1127 .fromsec = { "__ksymtab*", NULL },
1128 .bad_tosec = { INIT_SECTIONS, EXIT_SECTIONS, NULL },
1129 .mismatch = EXPORT_TO_INIT_EXIT,
1130 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1133 .fromsec = { "__ex_table", NULL },
1134 /* If you're adding any new black-listed sections in here, consider
1135 * adding a special 'printer' for them in scripts/check_extable.
1137 .bad_tosec = { ".altinstr_replacement", NULL },
1138 .good_tosec = {ALL_TEXT_SECTIONS , NULL},
1139 .mismatch = EXTABLE_TO_NON_TEXT,
1140 .handler = extable_mismatch_handler,
1144 static const struct sectioncheck *section_mismatch(
1145 const char *fromsec, const char *tosec)
1148 int elems = sizeof(sectioncheck) / sizeof(struct sectioncheck);
1149 const struct sectioncheck *check = §ioncheck[0];
1152 * The target section could be the SHT_NUL section when we're
1153 * handling relocations to un-resolved symbols, trying to match it
1154 * doesn't make much sense and causes build failures on parisc
1160 for (i = 0; i < elems; i++) {
1161 if (match(fromsec, check->fromsec)) {
1162 if (check->bad_tosec[0] && match(tosec, check->bad_tosec))
1164 if (check->good_tosec[0] && !match(tosec, check->good_tosec))
1173 * Whitelist to allow certain references to pass with no warning.
1176 * If a module parameter is declared __initdata and permissions=0
1177 * then this is legal despite the warning generated.
1178 * We cannot see value of permissions here, so just ignore
1180 * The pattern is identified by:
1181 * tosec = .init.data
1186 * module_param_call() ops can refer to __init set function if permissions=0
1187 * The pattern is identified by:
1188 * tosec = .init.text
1190 * atsym = __param_ops_*
1193 * Many drivers utilise a *driver container with references to
1194 * add, remove, probe functions etc.
1195 * the pattern is identified by:
1196 * tosec = init or exit section
1197 * fromsec = data section
1198 * atsym = *driver, *_template, *_sht, *_ops, *_probe,
1199 * *probe_one, *_console, *_timer
1202 * Whitelist all references from .head.text to any init section
1205 * Some symbols belong to init section but still it is ok to reference
1206 * these from non-init sections as these symbols don't have any memory
1207 * allocated for them and symbol address and value are same. So even
1208 * if init section is freed, its ok to reference those symbols.
1209 * For ex. symbols marking the init section boundaries.
1210 * This pattern is identified by
1211 * refsymname = __init_begin, _sinittext, _einittext
1214 * GCC may optimize static inlines when fed constant arg(s) resulting
1215 * in functions like cpumask_empty() -- generating an associated symbol
1216 * cpumask_empty.constprop.3 that appears in the audit. If the const that
1217 * is passed in comes from __init, like say nmi_ipi_mask, we get a
1218 * meaningless section warning. May need to add isra symbols too...
1219 * This pattern is identified by
1220 * tosec = init section
1221 * fromsec = text section
1222 * refsymname = *.constprop.*
1225 * Hide section mismatch warnings for ELF local symbols. The goal
1226 * is to eliminate false positive modpost warnings caused by
1227 * compiler-generated ELF local symbol names such as ".LANCHOR1".
1228 * Autogenerated symbol names bypass modpost's "Pattern 2"
1229 * whitelisting, which relies on pattern-matching against symbol
1230 * names to work. (One situation where gcc can autogenerate ELF
1231 * local symbols is when "-fsection-anchors" is used.)
1233 static int secref_whitelist(const struct sectioncheck *mismatch,
1234 const char *fromsec, const char *fromsym,
1235 const char *tosec, const char *tosym)
1237 /* Check for pattern 1 */
1238 if (match(tosec, init_data_sections) &&
1239 match(fromsec, data_sections) &&
1240 strstarts(fromsym, "__param"))
1243 /* Check for pattern 1a */
1244 if (strcmp(tosec, ".init.text") == 0 &&
1245 match(fromsec, data_sections) &&
1246 strstarts(fromsym, "__param_ops_"))
1249 /* Check for pattern 2 */
1250 if (match(tosec, init_exit_sections) &&
1251 match(fromsec, data_sections) &&
1252 match(fromsym, mismatch->symbol_white_list))
1255 /* Check for pattern 3 */
1256 if (match(fromsec, head_sections) &&
1257 match(tosec, init_sections))
1260 /* Check for pattern 4 */
1261 if (match(tosym, linker_symbols))
1264 /* Check for pattern 5 */
1265 if (match(fromsec, text_sections) &&
1266 match(tosec, init_sections) &&
1267 match(fromsym, optim_symbols))
1270 /* Check for pattern 6 */
1271 if (strstarts(fromsym, ".L"))
1277 static inline int is_arm_mapping_symbol(const char *str)
1279 return str[0] == '$' && strchr("axtd", str[1])
1280 && (str[2] == '\0' || str[2] == '.');
1284 * If there's no name there, ignore it; likewise, ignore it if it's
1285 * one of the magic symbols emitted used by current ARM tools.
1287 * Otherwise if find_symbols_between() returns those symbols, they'll
1288 * fail the whitelist tests and cause lots of false alarms ... fixable
1289 * only by merging __exit and __init sections into __text, bloating
1290 * the kernel (which is especially evil on embedded platforms).
1292 static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym)
1294 const char *name = elf->strtab + sym->st_name;
1296 if (!name || !strlen(name))
1298 return !is_arm_mapping_symbol(name);
1302 * Find symbol based on relocation record info.
1303 * In some cases the symbol supplied is a valid symbol so
1304 * return refsym. If st_name != 0 we assume this is a valid symbol.
1305 * In other cases the symbol needs to be looked up in the symbol table
1306 * based on section and address.
1308 static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr,
1312 Elf_Sym *near = NULL;
1313 Elf64_Sword distance = 20;
1315 unsigned int relsym_secindex;
1317 if (relsym->st_name != 0)
1320 relsym_secindex = get_secindex(elf, relsym);
1321 for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
1322 if (get_secindex(elf, sym) != relsym_secindex)
1324 if (ELF_ST_TYPE(sym->st_info) == STT_SECTION)
1326 if (!is_valid_name(elf, sym))
1328 if (sym->st_value == addr)
1330 /* Find a symbol nearby - addr are maybe negative */
1331 d = sym->st_value - addr;
1333 d = addr - sym->st_value;
1339 /* We need a close match */
1347 * Find symbols before or equal addr and after addr - in the section sec.
1348 * If we find two symbols with equal offset prefer one with a valid name.
1349 * The ELF format may have a better way to detect what type of symbol
1350 * it is, but this works for now.
1352 static Elf_Sym *find_elf_symbol2(struct elf_info *elf, Elf_Addr addr,
1356 Elf_Sym *near = NULL;
1357 Elf_Addr distance = ~0;
1359 for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
1362 if (is_shndx_special(sym->st_shndx))
1364 symsec = sec_name(elf, get_secindex(elf, sym));
1365 if (strcmp(symsec, sec) != 0)
1367 if (!is_valid_name(elf, sym))
1369 if (sym->st_value <= addr) {
1370 if ((addr - sym->st_value) < distance) {
1371 distance = addr - sym->st_value;
1373 } else if ((addr - sym->st_value) == distance) {
1382 * Convert a section name to the function/data attribute
1383 * .init.text => __init
1384 * .memexitconst => __memconst
1387 * The memory of returned value has been allocated on a heap. The user of this
1388 * method should free it after usage.
1390 static char *sec2annotation(const char *s)
1392 if (match(s, init_exit_sections)) {
1393 char *p = NOFAIL(malloc(20));
1400 while (*s && *s != '.')
1405 if (strstr(s, "rodata") != NULL)
1406 strcat(p, "const ");
1407 else if (strstr(s, "data") != NULL)
1413 return NOFAIL(strdup(""));
1417 static int is_function(Elf_Sym *sym)
1420 return ELF_ST_TYPE(sym->st_info) == STT_FUNC;
1425 static void print_section_list(const char * const list[20])
1427 const char *const *s = list;
1430 fprintf(stderr, "%s", *s);
1433 fprintf(stderr, ", ");
1435 fprintf(stderr, "\n");
1438 static inline void get_pretty_name(int is_func, const char** name, const char** name_p)
1441 case 0: *name = "variable"; *name_p = ""; break;
1442 case 1: *name = "function"; *name_p = "()"; break;
1443 default: *name = "(unknown reference)"; *name_p = ""; break;
1448 * Print a warning about a section mismatch.
1449 * Try to find symbols near it so user can find it.
1450 * Check whitelist before warning - it may be a false positive.
1452 static void report_sec_mismatch(const char *modname,
1453 const struct sectioncheck *mismatch,
1454 const char *fromsec,
1455 unsigned long long fromaddr,
1456 const char *fromsym,
1458 const char *tosec, const char *tosym,
1461 const char *from, *from_p;
1462 const char *to, *to_p;
1466 sec_mismatch_count++;
1468 get_pretty_name(from_is_func, &from, &from_p);
1469 get_pretty_name(to_is_func, &to, &to_p);
1471 warn("%s(%s+0x%llx): Section mismatch in reference from the %s %s%s "
1472 "to the %s %s:%s%s\n",
1473 modname, fromsec, fromaddr, from, fromsym, from_p, to, tosec,
1476 switch (mismatch->mismatch) {
1477 case TEXT_TO_ANY_INIT:
1478 prl_from = sec2annotation(fromsec);
1479 prl_to = sec2annotation(tosec);
1481 "The function %s%s() references\n"
1483 "This is often because %s lacks a %s\n"
1484 "annotation or the annotation of %s is wrong.\n",
1486 to, prl_to, tosym, to_p,
1487 fromsym, prl_to, tosym);
1491 case DATA_TO_ANY_INIT: {
1492 prl_to = sec2annotation(tosec);
1494 "The variable %s references\n"
1496 "If the reference is valid then annotate the\n"
1497 "variable with __init* or __refdata (see linux/init.h) "
1498 "or name the variable:\n",
1499 fromsym, to, prl_to, tosym, to_p);
1500 print_section_list(mismatch->symbol_white_list);
1504 case TEXT_TO_ANY_EXIT:
1505 prl_to = sec2annotation(tosec);
1507 "The function %s() references a %s in an exit section.\n"
1508 "Often the %s %s%s has valid usage outside the exit section\n"
1509 "and the fix is to remove the %sannotation of %s.\n",
1510 fromsym, to, to, tosym, to_p, prl_to, tosym);
1513 case DATA_TO_ANY_EXIT: {
1514 prl_to = sec2annotation(tosec);
1516 "The variable %s references\n"
1518 "If the reference is valid then annotate the\n"
1519 "variable with __exit* (see linux/init.h) or "
1520 "name the variable:\n",
1521 fromsym, to, prl_to, tosym, to_p);
1522 print_section_list(mismatch->symbol_white_list);
1526 case XXXINIT_TO_SOME_INIT:
1527 case XXXEXIT_TO_SOME_EXIT:
1528 prl_from = sec2annotation(fromsec);
1529 prl_to = sec2annotation(tosec);
1531 "The %s %s%s%s references\n"
1533 "If %s is only used by %s then\n"
1534 "annotate %s with a matching annotation.\n",
1535 from, prl_from, fromsym, from_p,
1536 to, prl_to, tosym, to_p,
1537 tosym, fromsym, tosym);
1541 case ANY_INIT_TO_ANY_EXIT:
1542 prl_from = sec2annotation(fromsec);
1543 prl_to = sec2annotation(tosec);
1545 "The %s %s%s%s references\n"
1547 "This is often seen when error handling "
1548 "in the init function\n"
1549 "uses functionality in the exit path.\n"
1550 "The fix is often to remove the %sannotation of\n"
1551 "%s%s so it may be used outside an exit section.\n",
1552 from, prl_from, fromsym, from_p,
1553 to, prl_to, tosym, to_p,
1554 prl_to, tosym, to_p);
1558 case ANY_EXIT_TO_ANY_INIT:
1559 prl_from = sec2annotation(fromsec);
1560 prl_to = sec2annotation(tosec);
1562 "The %s %s%s%s references\n"
1564 "This is often seen when error handling "
1565 "in the exit function\n"
1566 "uses functionality in the init path.\n"
1567 "The fix is often to remove the %sannotation of\n"
1568 "%s%s so it may be used outside an init section.\n",
1569 from, prl_from, fromsym, from_p,
1570 to, prl_to, tosym, to_p,
1571 prl_to, tosym, to_p);
1575 case EXPORT_TO_INIT_EXIT:
1576 prl_to = sec2annotation(tosec);
1578 "The symbol %s is exported and annotated %s\n"
1579 "Fix this by removing the %sannotation of %s "
1580 "or drop the export.\n",
1581 tosym, prl_to, prl_to, tosym);
1584 case EXTABLE_TO_NON_TEXT:
1585 fatal("There's a special handler for this mismatch type, "
1586 "we should never get here.");
1589 fprintf(stderr, "\n");
1592 static void default_mismatch_handler(const char *modname, struct elf_info *elf,
1593 const struct sectioncheck* const mismatch,
1594 Elf_Rela *r, Elf_Sym *sym, const char *fromsec)
1600 const char *fromsym;
1602 from = find_elf_symbol2(elf, r->r_offset, fromsec);
1603 fromsym = sym_name(elf, from);
1605 if (strstarts(fromsym, "reference___initcall"))
1608 tosec = sec_name(elf, get_secindex(elf, sym));
1609 to = find_elf_symbol(elf, r->r_addend, sym);
1610 tosym = sym_name(elf, to);
1612 /* check whitelist - we may ignore it */
1613 if (secref_whitelist(mismatch,
1614 fromsec, fromsym, tosec, tosym)) {
1615 report_sec_mismatch(modname, mismatch,
1616 fromsec, r->r_offset, fromsym,
1617 is_function(from), tosec, tosym,
1622 static int is_executable_section(struct elf_info* elf, unsigned int section_index)
1624 if (section_index > elf->num_sections)
1625 fatal("section_index is outside elf->num_sections!\n");
1627 return ((elf->sechdrs[section_index].sh_flags & SHF_EXECINSTR) == SHF_EXECINSTR);
1631 * We rely on a gross hack in section_rel[a]() calling find_extable_entry_size()
1632 * to know the sizeof(struct exception_table_entry) for the target architecture.
1634 static unsigned int extable_entry_size = 0;
1635 static void find_extable_entry_size(const char* const sec, const Elf_Rela* r)
1638 * If we're currently checking the second relocation within __ex_table,
1639 * that relocation offset tells us the offsetof(struct
1640 * exception_table_entry, fixup) which is equal to sizeof(struct
1641 * exception_table_entry) divided by two. We use that to our advantage
1642 * since there's no portable way to get that size as every architecture
1643 * seems to go with different sized types. Not pretty but better than
1644 * hard-coding the size for every architecture..
1646 if (!extable_entry_size)
1647 extable_entry_size = r->r_offset * 2;
1650 static inline bool is_extable_fault_address(Elf_Rela *r)
1653 * extable_entry_size is only discovered after we've handled the
1654 * _second_ relocation in __ex_table, so only abort when we're not
1655 * handling the first reloc and extable_entry_size is zero.
1657 if (r->r_offset && extable_entry_size == 0)
1658 fatal("extable_entry size hasn't been discovered!\n");
1660 return ((r->r_offset == 0) ||
1661 (r->r_offset % extable_entry_size == 0));
1664 #define is_second_extable_reloc(Start, Cur, Sec) \
1665 (((Cur) == (Start) + 1) && (strcmp("__ex_table", (Sec)) == 0))
1667 static void report_extable_warnings(const char* modname, struct elf_info* elf,
1668 const struct sectioncheck* const mismatch,
1669 Elf_Rela* r, Elf_Sym* sym,
1670 const char* fromsec, const char* tosec)
1672 Elf_Sym* fromsym = find_elf_symbol2(elf, r->r_offset, fromsec);
1673 const char* fromsym_name = sym_name(elf, fromsym);
1674 Elf_Sym* tosym = find_elf_symbol(elf, r->r_addend, sym);
1675 const char* tosym_name = sym_name(elf, tosym);
1676 const char* from_pretty_name;
1677 const char* from_pretty_name_p;
1678 const char* to_pretty_name;
1679 const char* to_pretty_name_p;
1681 get_pretty_name(is_function(fromsym),
1682 &from_pretty_name, &from_pretty_name_p);
1683 get_pretty_name(is_function(tosym),
1684 &to_pretty_name, &to_pretty_name_p);
1686 warn("%s(%s+0x%lx): Section mismatch in reference"
1687 " from the %s %s%s to the %s %s:%s%s\n",
1688 modname, fromsec, (long)r->r_offset, from_pretty_name,
1689 fromsym_name, from_pretty_name_p,
1690 to_pretty_name, tosec, tosym_name, to_pretty_name_p);
1692 if (!match(tosec, mismatch->bad_tosec) &&
1693 is_executable_section(elf, get_secindex(elf, sym)))
1695 "The relocation at %s+0x%lx references\n"
1696 "section \"%s\" which is not in the list of\n"
1697 "authorized sections. If you're adding a new section\n"
1698 "and/or if this reference is valid, add \"%s\" to the\n"
1699 "list of authorized sections to jump to on fault.\n"
1700 "This can be achieved by adding \"%s\" to \n"
1701 "OTHER_TEXT_SECTIONS in scripts/mod/modpost.c.\n",
1702 fromsec, (long)r->r_offset, tosec, tosec, tosec);
1705 static void extable_mismatch_handler(const char* modname, struct elf_info *elf,
1706 const struct sectioncheck* const mismatch,
1707 Elf_Rela* r, Elf_Sym* sym,
1708 const char *fromsec)
1710 const char* tosec = sec_name(elf, get_secindex(elf, sym));
1712 sec_mismatch_count++;
1714 report_extable_warnings(modname, elf, mismatch, r, sym, fromsec, tosec);
1716 if (match(tosec, mismatch->bad_tosec))
1717 fatal("The relocation at %s+0x%lx references\n"
1718 "section \"%s\" which is black-listed.\n"
1719 "Something is seriously wrong and should be fixed.\n"
1720 "You might get more information about where this is\n"
1721 "coming from by using scripts/check_extable.sh %s\n",
1722 fromsec, (long)r->r_offset, tosec, modname);
1723 else if (!is_executable_section(elf, get_secindex(elf, sym))) {
1724 if (is_extable_fault_address(r))
1725 fatal("The relocation at %s+0x%lx references\n"
1726 "section \"%s\" which is not executable, IOW\n"
1727 "it is not possible for the kernel to fault\n"
1728 "at that address. Something is seriously wrong\n"
1729 "and should be fixed.\n",
1730 fromsec, (long)r->r_offset, tosec);
1732 fatal("The relocation at %s+0x%lx references\n"
1733 "section \"%s\" which is not executable, IOW\n"
1734 "the kernel will fault if it ever tries to\n"
1735 "jump to it. Something is seriously wrong\n"
1736 "and should be fixed.\n",
1737 fromsec, (long)r->r_offset, tosec);
1741 static void check_section_mismatch(const char *modname, struct elf_info *elf,
1742 Elf_Rela *r, Elf_Sym *sym, const char *fromsec)
1744 const char *tosec = sec_name(elf, get_secindex(elf, sym));
1745 const struct sectioncheck *mismatch = section_mismatch(fromsec, tosec);
1748 if (mismatch->handler)
1749 mismatch->handler(modname, elf, mismatch,
1752 default_mismatch_handler(modname, elf, mismatch,
1757 static unsigned int *reloc_location(struct elf_info *elf,
1758 Elf_Shdr *sechdr, Elf_Rela *r)
1760 Elf_Shdr *sechdrs = elf->sechdrs;
1761 int section = sechdr->sh_info;
1763 return (void *)elf->hdr + sechdrs[section].sh_offset +
1767 static int addend_386_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1769 unsigned int r_typ = ELF_R_TYPE(r->r_info);
1770 unsigned int *location = reloc_location(elf, sechdr, r);
1774 r->r_addend = TO_NATIVE(*location);
1777 r->r_addend = TO_NATIVE(*location) + 4;
1778 /* For CONFIG_RELOCATABLE=y */
1779 if (elf->hdr->e_type == ET_EXEC)
1780 r->r_addend += r->r_offset;
1787 #define R_ARM_CALL 28
1789 #ifndef R_ARM_JUMP24
1790 #define R_ARM_JUMP24 29
1793 #ifndef R_ARM_THM_CALL
1794 #define R_ARM_THM_CALL 10
1796 #ifndef R_ARM_THM_JUMP24
1797 #define R_ARM_THM_JUMP24 30
1799 #ifndef R_ARM_THM_JUMP19
1800 #define R_ARM_THM_JUMP19 51
1803 static int addend_arm_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1805 unsigned int r_typ = ELF_R_TYPE(r->r_info);
1809 /* From ARM ABI: (S + A) | T */
1810 r->r_addend = (int)(long)
1811 (elf->symtab_start + ELF_R_SYM(r->r_info));
1816 case R_ARM_THM_CALL:
1817 case R_ARM_THM_JUMP24:
1818 case R_ARM_THM_JUMP19:
1819 /* From ARM ABI: ((S + A) | T) - P */
1820 r->r_addend = (int)(long)(elf->hdr +
1822 (r->r_offset - sechdr->sh_addr));
1830 static int addend_mips_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1832 unsigned int r_typ = ELF_R_TYPE(r->r_info);
1833 unsigned int *location = reloc_location(elf, sechdr, r);
1836 if (r_typ == R_MIPS_HI16)
1837 return 1; /* skip this */
1838 inst = TO_NATIVE(*location);
1841 r->r_addend = inst & 0xffff;
1844 r->r_addend = (inst & 0x03ffffff) << 2;
1853 static void section_rela(const char *modname, struct elf_info *elf,
1860 const char *fromsec;
1862 Elf_Rela *start = (void *)elf->hdr + sechdr->sh_offset;
1863 Elf_Rela *stop = (void *)start + sechdr->sh_size;
1865 fromsec = sech_name(elf, sechdr);
1866 fromsec += strlen(".rela");
1867 /* if from section (name) is know good then skip it */
1868 if (match(fromsec, section_white_list))
1871 for (rela = start; rela < stop; rela++) {
1872 r.r_offset = TO_NATIVE(rela->r_offset);
1873 #if KERNEL_ELFCLASS == ELFCLASS64
1874 if (elf->hdr->e_machine == EM_MIPS) {
1876 r_sym = ELF64_MIPS_R_SYM(rela->r_info);
1877 r_sym = TO_NATIVE(r_sym);
1878 r_typ = ELF64_MIPS_R_TYPE(rela->r_info);
1879 r.r_info = ELF64_R_INFO(r_sym, r_typ);
1881 r.r_info = TO_NATIVE(rela->r_info);
1882 r_sym = ELF_R_SYM(r.r_info);
1885 r.r_info = TO_NATIVE(rela->r_info);
1886 r_sym = ELF_R_SYM(r.r_info);
1888 r.r_addend = TO_NATIVE(rela->r_addend);
1889 sym = elf->symtab_start + r_sym;
1890 /* Skip special sections */
1891 if (is_shndx_special(sym->st_shndx))
1893 if (is_second_extable_reloc(start, rela, fromsec))
1894 find_extable_entry_size(fromsec, &r);
1895 check_section_mismatch(modname, elf, &r, sym, fromsec);
1899 static void section_rel(const char *modname, struct elf_info *elf,
1906 const char *fromsec;
1908 Elf_Rel *start = (void *)elf->hdr + sechdr->sh_offset;
1909 Elf_Rel *stop = (void *)start + sechdr->sh_size;
1911 fromsec = sech_name(elf, sechdr);
1912 fromsec += strlen(".rel");
1913 /* if from section (name) is know good then skip it */
1914 if (match(fromsec, section_white_list))
1917 for (rel = start; rel < stop; rel++) {
1918 r.r_offset = TO_NATIVE(rel->r_offset);
1919 #if KERNEL_ELFCLASS == ELFCLASS64
1920 if (elf->hdr->e_machine == EM_MIPS) {
1922 r_sym = ELF64_MIPS_R_SYM(rel->r_info);
1923 r_sym = TO_NATIVE(r_sym);
1924 r_typ = ELF64_MIPS_R_TYPE(rel->r_info);
1925 r.r_info = ELF64_R_INFO(r_sym, r_typ);
1927 r.r_info = TO_NATIVE(rel->r_info);
1928 r_sym = ELF_R_SYM(r.r_info);
1931 r.r_info = TO_NATIVE(rel->r_info);
1932 r_sym = ELF_R_SYM(r.r_info);
1935 switch (elf->hdr->e_machine) {
1937 if (addend_386_rel(elf, sechdr, &r))
1941 if (addend_arm_rel(elf, sechdr, &r))
1945 if (addend_mips_rel(elf, sechdr, &r))
1949 sym = elf->symtab_start + r_sym;
1950 /* Skip special sections */
1951 if (is_shndx_special(sym->st_shndx))
1953 if (is_second_extable_reloc(start, rel, fromsec))
1954 find_extable_entry_size(fromsec, &r);
1955 check_section_mismatch(modname, elf, &r, sym, fromsec);
1960 * A module includes a number of sections that are discarded
1961 * either when loaded or when used as built-in.
1962 * For loaded modules all functions marked __init and all data
1963 * marked __initdata will be discarded when the module has been initialized.
1964 * Likewise for modules used built-in the sections marked __exit
1965 * are discarded because __exit marked function are supposed to be called
1966 * only when a module is unloaded which never happens for built-in modules.
1967 * The check_sec_ref() function traverses all relocation records
1968 * to find all references to a section that reference a section that will
1969 * be discarded and warns about it.
1971 static void check_sec_ref(struct module *mod, const char *modname,
1972 struct elf_info *elf)
1975 Elf_Shdr *sechdrs = elf->sechdrs;
1977 /* Walk through all sections */
1978 for (i = 0; i < elf->num_sections; i++) {
1979 check_section(modname, elf, &elf->sechdrs[i]);
1980 /* We want to process only relocation sections and not .init */
1981 if (sechdrs[i].sh_type == SHT_RELA)
1982 section_rela(modname, elf, &elf->sechdrs[i]);
1983 else if (sechdrs[i].sh_type == SHT_REL)
1984 section_rel(modname, elf, &elf->sechdrs[i]);
1988 static char *remove_dot(char *s)
1990 size_t n = strcspn(s, ".");
1993 size_t m = strspn(s + n + 1, "0123456789");
1994 if (m && (s[n + m] == '.' || s[n + m] == 0))
2000 static void read_symbols(const char *modname)
2002 const char *symname;
2007 struct elf_info info = { };
2010 if (!parse_elf(&info, modname))
2013 mod = new_module(modname);
2015 /* When there's no vmlinux, don't print warnings about
2016 * unresolved symbols (since there'll be too many ;) */
2017 if (is_vmlinux(modname)) {
2022 license = get_modinfo(&info, "license");
2023 if (!license && !is_vmlinux(modname))
2024 warn("modpost: missing MODULE_LICENSE() in %s\n"
2025 "see include/linux/module.h for "
2026 "more information\n", modname);
2028 if (license_is_gpl_compatible(license))
2029 mod->gpl_compatible = 1;
2031 mod->gpl_compatible = 0;
2034 license = get_next_modinfo(&info, "license", license);
2037 namespace = get_modinfo(&info, "import_ns");
2039 add_namespace(&mod->imported_namespaces, namespace);
2040 namespace = get_next_modinfo(&info, "import_ns", namespace);
2043 for (sym = info.symtab_start; sym < info.symtab_stop; sym++) {
2044 symname = remove_dot(info.strtab + sym->st_name);
2046 handle_symbol(mod, &info, sym, symname);
2047 handle_moddevtable(mod, &info, sym, symname);
2050 for (sym = info.symtab_start; sym < info.symtab_stop; sym++) {
2051 symname = remove_dot(info.strtab + sym->st_name);
2053 /* Apply symbol namespaces from __kstrtabns_<symbol> entries. */
2054 if (strstarts(symname, "__kstrtabns_"))
2055 sym_update_namespace(symname + strlen("__kstrtabns_"),
2056 namespace_from_kstrtabns(&info,
2059 if (strstarts(symname, "__crc_"))
2060 handle_modversion(mod, &info, sym,
2061 symname + strlen("__crc_"));
2064 // check for static EXPORT_SYMBOL_* functions && global vars
2065 for (sym = info.symtab_start; sym < info.symtab_stop; sym++) {
2066 unsigned char bind = ELF_ST_BIND(sym->st_info);
2068 if (bind == STB_GLOBAL || bind == STB_WEAK) {
2070 find_symbol(remove_dot(info.strtab +
2078 if (!is_vmlinux(modname) || vmlinux_section_warnings)
2079 check_sec_ref(mod, modname, &info);
2081 version = get_modinfo(&info, "version");
2083 maybe_frob_rcs_version(modname, version, info.modinfo,
2084 version - (char *)info.hdr);
2085 if (version || (all_versions && !is_vmlinux(modname)))
2086 get_src_version(modname, mod->srcversion,
2087 sizeof(mod->srcversion)-1);
2089 parse_elf_finish(&info);
2091 /* Our trick to get versioning for module struct etc. - it's
2092 * never passed as an argument to an exported function, so
2093 * the automatic versioning doesn't pick it up, but it's really
2094 * important anyhow */
2096 mod->unres = alloc_symbol("module_layout", 0, mod->unres);
2099 static void read_symbols_from_files(const char *filename)
2102 char fname[PATH_MAX];
2104 if (strcmp(filename, "-") != 0) {
2105 in = fopen(filename, "r");
2107 fatal("Can't open filenames file %s: %m", filename);
2110 while (fgets(fname, PATH_MAX, in) != NULL) {
2111 if (strends(fname, "\n"))
2112 fname[strlen(fname)-1] = '\0';
2113 read_symbols(fname);
2122 /* We first write the generated file into memory using the
2123 * following helper, then compare to the file on disk and
2124 * only update the later if anything changed */
2126 void __attribute__((format(printf, 2, 3))) buf_printf(struct buffer *buf,
2127 const char *fmt, ...)
2134 len = vsnprintf(tmp, SZ, fmt, ap);
2135 buf_write(buf, tmp, len);
2139 void buf_write(struct buffer *buf, const char *s, int len)
2141 if (buf->size - buf->pos < len) {
2142 buf->size += len + SZ;
2143 buf->p = NOFAIL(realloc(buf->p, buf->size));
2145 strncpy(buf->p + buf->pos, s, len);
2149 static void check_for_gpl_usage(enum export exp, const char *m, const char *s)
2151 const char *e = is_vmlinux(m) ?"":".ko";
2155 fatal("modpost: GPL-incompatible module %s%s "
2156 "uses GPL-only symbol '%s'\n", m, e, s);
2158 case export_unused_gpl:
2159 fatal("modpost: GPL-incompatible module %s%s "
2160 "uses GPL-only symbol marked UNUSED '%s'\n", m, e, s);
2162 case export_gpl_future:
2163 warn("modpost: GPL-incompatible module %s%s "
2164 "uses future GPL-only symbol '%s'\n", m, e, s);
2168 case export_unknown:
2174 static void check_for_unused(enum export exp, const char *m, const char *s)
2176 const char *e = is_vmlinux(m) ?"":".ko";
2180 case export_unused_gpl:
2181 warn("modpost: module %s%s "
2182 "uses symbol '%s' marked UNUSED\n", m, e, s);
2190 static int check_exports(struct module *mod)
2192 struct symbol *s, *exp;
2195 for (s = mod->unres; s; s = s->next) {
2196 const char *basename;
2197 exp = find_symbol(s->name);
2198 if (!exp || exp->module == mod) {
2199 if (have_vmlinux && !s->weak) {
2200 if (warn_unresolved) {
2201 warn("\"%s\" [%s.ko] undefined!\n",
2202 s->name, mod->name);
2204 merror("\"%s\" [%s.ko] undefined!\n",
2205 s->name, mod->name);
2211 basename = strrchr(mod->name, '/');
2215 basename = mod->name;
2217 if (exp->namespace &&
2218 !module_imports_namespace(mod, exp->namespace)) {
2219 warn("module %s uses symbol %s from namespace %s, but does not import it.\n",
2220 basename, exp->name, exp->namespace);
2221 add_namespace(&mod->missing_namespaces, exp->namespace);
2224 if (!mod->gpl_compatible)
2225 check_for_gpl_usage(exp->export, basename, exp->name);
2226 check_for_unused(exp->export, basename, exp->name);
2232 static int check_modname_len(struct module *mod)
2234 const char *mod_name;
2236 mod_name = strrchr(mod->name, '/');
2237 if (mod_name == NULL)
2238 mod_name = mod->name;
2241 if (strlen(mod_name) >= MODULE_NAME_LEN) {
2242 merror("module name is too long [%s.ko]\n", mod->name);
2250 * Header for the generated file
2252 static void add_header(struct buffer *b, struct module *mod)
2254 buf_printf(b, "#include <linux/build-salt.h>\n");
2255 buf_printf(b, "#include <linux/module.h>\n");
2256 buf_printf(b, "#include <linux/vermagic.h>\n");
2257 buf_printf(b, "#include <linux/compiler.h>\n");
2258 buf_printf(b, "\n");
2259 buf_printf(b, "BUILD_SALT;\n");
2260 buf_printf(b, "\n");
2261 buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n");
2262 buf_printf(b, "MODULE_INFO(name, KBUILD_MODNAME);\n");
2263 buf_printf(b, "\n");
2264 buf_printf(b, "__visible struct module __this_module\n");
2265 buf_printf(b, "__section(.gnu.linkonce.this_module) = {\n");
2266 buf_printf(b, "\t.name = KBUILD_MODNAME,\n");
2268 buf_printf(b, "\t.init = init_module,\n");
2269 if (mod->has_cleanup)
2270 buf_printf(b, "#ifdef CONFIG_MODULE_UNLOAD\n"
2271 "\t.exit = cleanup_module,\n"
2273 buf_printf(b, "\t.arch = MODULE_ARCH_INIT,\n");
2274 buf_printf(b, "};\n");
2277 static void add_intree_flag(struct buffer *b, int is_intree)
2280 buf_printf(b, "\nMODULE_INFO(intree, \"Y\");\n");
2283 /* Cannot check for assembler */
2284 static void add_retpoline(struct buffer *b)
2286 buf_printf(b, "\n#ifdef CONFIG_RETPOLINE\n");
2287 buf_printf(b, "MODULE_INFO(retpoline, \"Y\");\n");
2288 buf_printf(b, "#endif\n");
2291 static void add_staging_flag(struct buffer *b, const char *name)
2293 if (strstarts(name, "drivers/staging"))
2294 buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n");
2298 * Record CRCs for unresolved symbols
2300 static int add_versions(struct buffer *b, struct module *mod)
2302 struct symbol *s, *exp;
2305 for (s = mod->unres; s; s = s->next) {
2306 exp = find_symbol(s->name);
2307 if (!exp || exp->module == mod)
2309 s->module = exp->module;
2310 s->crc_valid = exp->crc_valid;
2317 buf_printf(b, "\n");
2318 buf_printf(b, "static const struct modversion_info ____versions[]\n");
2319 buf_printf(b, "__used __section(__versions) = {\n");
2321 for (s = mod->unres; s; s = s->next) {
2324 if (!s->crc_valid) {
2325 warn("\"%s\" [%s.ko] has no CRC!\n",
2326 s->name, mod->name);
2329 if (strlen(s->name) >= MODULE_NAME_LEN) {
2330 merror("too long symbol \"%s\" [%s.ko]\n",
2331 s->name, mod->name);
2335 buf_printf(b, "\t{ %#8x, \"%s\" },\n",
2339 buf_printf(b, "};\n");
2344 static void add_depends(struct buffer *b, struct module *mod)
2349 /* Clear ->seen flag of modules that own symbols needed by this. */
2350 for (s = mod->unres; s; s = s->next)
2352 s->module->seen = is_vmlinux(s->module->name);
2354 buf_printf(b, "\n");
2355 buf_printf(b, "MODULE_INFO(depends, \"");
2356 for (s = mod->unres; s; s = s->next) {
2361 if (s->module->seen)
2364 s->module->seen = 1;
2365 p = strrchr(s->module->name, '/');
2369 p = s->module->name;
2370 buf_printf(b, "%s%s", first ? "" : ",", p);
2373 buf_printf(b, "\");\n");
2376 static void add_srcversion(struct buffer *b, struct module *mod)
2378 if (mod->srcversion[0]) {
2379 buf_printf(b, "\n");
2380 buf_printf(b, "MODULE_INFO(srcversion, \"%s\");\n",
2385 static void write_if_changed(struct buffer *b, const char *fname)
2391 file = fopen(fname, "r");
2395 if (fstat(fileno(file), &st) < 0)
2398 if (st.st_size != b->pos)
2401 tmp = NOFAIL(malloc(b->pos));
2402 if (fread(tmp, 1, b->pos, file) != b->pos)
2405 if (memcmp(tmp, b->p, b->pos) != 0)
2417 file = fopen(fname, "w");
2422 if (fwrite(b->p, 1, b->pos, file) != b->pos) {
2429 /* parse Module.symvers file. line format:
2430 * 0x12345678<tab>symbol<tab>module<tab>export<tab>namespace
2432 static void read_dump(const char *fname, unsigned int kernel)
2434 unsigned long size, pos = 0;
2435 void *file = grab_file(fname, &size);
2439 /* No symbol versions, silently ignore */
2442 while ((line = get_next_line(&pos, file, size))) {
2443 char *symname, *namespace, *modname, *d, *export;
2448 if (!(symname = strchr(line, '\t')))
2451 if (!(modname = strchr(symname, '\t')))
2454 if (!(export = strchr(modname, '\t')))
2457 if (!(namespace = strchr(export, '\t')))
2459 *namespace++ = '\0';
2461 crc = strtoul(line, &d, 16);
2462 if (*symname == '\0' || *modname == '\0' || *d != '\0')
2464 mod = find_module(modname);
2466 if (is_vmlinux(modname))
2468 mod = new_module(modname);
2471 s = sym_add_exported(symname, mod, export_no(export));
2474 sym_set_crc(symname, crc);
2475 sym_update_namespace(symname, namespace);
2477 release_file(file, size);
2480 release_file(file, size);
2481 fatal("parse error in symbol dump file\n");
2484 /* For normal builds always dump all symbols.
2485 * For external modules only dump symbols
2486 * that are not read from kernel Module.symvers.
2488 static int dump_sym(struct symbol *sym)
2490 if (!external_module)
2492 if (sym->vmlinux || sym->kernel)
2497 static void write_dump(const char *fname)
2499 struct buffer buf = { };
2500 struct symbol *symbol;
2501 const char *namespace;
2504 for (n = 0; n < SYMBOL_HASH_SIZE ; n++) {
2505 symbol = symbolhash[n];
2507 if (dump_sym(symbol)) {
2508 namespace = symbol->namespace;
2509 buf_printf(&buf, "0x%08x\t%s\t%s\t%s\t%s\n",
2510 symbol->crc, symbol->name,
2511 symbol->module->name,
2512 export_str(symbol->export),
2513 namespace ? namespace : "");
2515 symbol = symbol->next;
2518 write_if_changed(&buf, fname);
2522 static void write_namespace_deps_files(const char *fname)
2525 struct namespace_list *ns;
2526 struct buffer ns_deps_buf = {};
2528 for (mod = modules; mod; mod = mod->next) {
2530 if (mod->skip || !mod->missing_namespaces)
2533 buf_printf(&ns_deps_buf, "%s.ko:", mod->name);
2535 for (ns = mod->missing_namespaces; ns; ns = ns->next)
2536 buf_printf(&ns_deps_buf, " %s", ns->namespace);
2538 buf_printf(&ns_deps_buf, "\n");
2541 write_if_changed(&ns_deps_buf, fname);
2542 free(ns_deps_buf.p);
2545 struct ext_sym_list {
2546 struct ext_sym_list *next;
2550 int main(int argc, char **argv)
2553 struct buffer buf = { };
2554 char *kernel_read = NULL;
2555 char *missing_namespace_deps = NULL;
2556 char *dump_write = NULL, *files_source = NULL;
2560 struct ext_sym_list *extsym_iter;
2561 struct ext_sym_list *extsym_start = NULL;
2563 while ((opt = getopt(argc, argv, "i:e:mnsT:o:awEd:")) != -1) {
2566 kernel_read = optarg;
2567 external_module = 1;
2570 external_module = 1;
2572 NOFAIL(malloc(sizeof(*extsym_iter)));
2573 extsym_iter->next = extsym_start;
2574 extsym_iter->file = optarg;
2575 extsym_start = extsym_iter;
2581 ignore_missing_files = 1;
2584 dump_write = optarg;
2590 vmlinux_section_warnings = 0;
2593 files_source = optarg;
2596 warn_unresolved = 1;
2599 sec_mismatch_fatal = 1;
2602 missing_namespace_deps = optarg;
2610 read_dump(kernel_read, 1);
2611 while (extsym_start) {
2612 read_dump(extsym_start->file, 0);
2613 extsym_iter = extsym_start->next;
2615 extsym_start = extsym_iter;
2618 while (optind < argc)
2619 read_symbols(argv[optind++]);
2622 read_symbols_from_files(files_source);
2626 for (mod = modules; mod; mod = mod->next) {
2627 char fname[PATH_MAX];
2634 err |= check_modname_len(mod);
2635 err |= check_exports(mod);
2637 add_header(&buf, mod);
2638 add_intree_flag(&buf, !external_module);
2639 add_retpoline(&buf);
2640 add_staging_flag(&buf, mod->name);
2641 err |= add_versions(&buf, mod);
2642 add_depends(&buf, mod);
2643 add_moddevtable(&buf, mod);
2644 add_srcversion(&buf, mod);
2646 sprintf(fname, "%s.mod.c", mod->name);
2647 write_if_changed(&buf, fname);
2650 if (missing_namespace_deps)
2651 write_namespace_deps_files(missing_namespace_deps);
2654 write_dump(dump_write);
2655 if (sec_mismatch_count && sec_mismatch_fatal)
2656 fatal("modpost: Section mismatches detected.\n"
2657 "Set CONFIG_SECTION_MISMATCH_WARN_ONLY=y to allow them.\n");
2658 for (n = 0; n < SYMBOL_HASH_SIZE; n++) {
2661 for (s = symbolhash[n]; s; s = s->next) {
2663 * Do not check "vmlinux". This avoids the same warnings
2664 * shown twice, and false-positives for ARCH=um.
2666 if (is_vmlinux(s->module->name) && !s->module->is_dot_o)
2670 warn("\"%s\" [%s] is a static %s\n",
2671 s->name, s->module->name,
2672 export_str(s->export));