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 ...
22 #include "../../include/generated/autoconf.h"
23 #include "../../include/linux/license.h"
24 #include "../../include/linux/export.h"
26 /* Are we using CONFIG_MODVERSIONS? */
27 static int modversions = 0;
28 /* Warn about undefined symbols? (do so if we have vmlinux) */
29 static int have_vmlinux = 0;
30 /* Is CONFIG_MODULE_SRCVERSION_ALL set? */
31 static int all_versions = 0;
32 /* If we are modposting external module set to 1 */
33 static int external_module = 0;
34 /* Warn about section mismatch in vmlinux if set to 1 */
35 static int vmlinux_section_warnings = 1;
36 /* Only warn about unresolved symbols */
37 static int warn_unresolved = 0;
38 /* How a symbol is exported */
39 static int sec_mismatch_count = 0;
40 static int sec_mismatch_verbose = 1;
41 /* ignore missing files */
42 static int ignore_missing_files;
45 export_plain, export_unused, export_gpl,
46 export_unused_gpl, export_gpl_future, export_unknown
49 #define PRINTF __attribute__ ((format (printf, 1, 2)))
51 PRINTF void fatal(const char *fmt, ...)
55 fprintf(stderr, "FATAL: ");
57 va_start(arglist, fmt);
58 vfprintf(stderr, fmt, arglist);
64 PRINTF void warn(const char *fmt, ...)
68 fprintf(stderr, "WARNING: ");
70 va_start(arglist, fmt);
71 vfprintf(stderr, fmt, arglist);
75 PRINTF void merror(const char *fmt, ...)
79 fprintf(stderr, "ERROR: ");
81 va_start(arglist, fmt);
82 vfprintf(stderr, fmt, arglist);
86 static inline bool strends(const char *str, const char *postfix)
88 if (strlen(str) < strlen(postfix))
91 return strcmp(str + strlen(str) - strlen(postfix), postfix) == 0;
94 static int is_vmlinux(const char *modname)
98 myname = strrchr(modname, '/');
104 return (strcmp(myname, "vmlinux") == 0) ||
105 (strcmp(myname, "vmlinux.o") == 0);
108 void *do_nofail(void *ptr, const char *expr)
111 fatal("modpost: Memory allocation failure: %s.\n", expr);
116 /* A list of all modules we processed */
117 static struct module *modules;
119 static struct module *find_module(char *modname)
123 for (mod = modules; mod; mod = mod->next)
124 if (strcmp(mod->name, modname) == 0)
129 static struct module *new_module(const char *modname)
134 mod = NOFAIL(malloc(sizeof(*mod)));
135 memset(mod, 0, sizeof(*mod));
136 p = NOFAIL(strdup(modname));
138 /* strip trailing .o */
139 if (strends(p, ".o")) {
140 p[strlen(p) - 2] = '\0';
146 mod->gpl_compatible = -1;
153 /* A hash of all exported symbols,
154 * struct symbol is also used for lists of unresolved symbols */
156 #define SYMBOL_HASH_SIZE 1024
160 struct module *module;
164 unsigned int vmlinux:1; /* 1 if symbol is defined in vmlinux */
165 unsigned int kernel:1; /* 1 if symbol is from kernel
166 * (only for external modules) **/
167 unsigned int preloaded:1; /* 1 if symbol from Module.symvers, or crc */
168 enum export export; /* Type of export */
172 static struct symbol *symbolhash[SYMBOL_HASH_SIZE];
174 /* This is based on the hash agorithm from gdbm, via tdb */
175 static inline unsigned int tdb_hash(const char *name)
177 unsigned value; /* Used to compute the hash value. */
178 unsigned i; /* Used to cycle through random values. */
180 /* Set the initial value from the key size. */
181 for (value = 0x238F13AF * strlen(name), i = 0; name[i]; i++)
182 value = (value + (((unsigned char *)name)[i] << (i*5 % 24)));
184 return (1103515243 * value + 12345);
188 * Allocate a new symbols for use in the hash of exported symbols or
189 * the list of unresolved symbols per module
191 static struct symbol *alloc_symbol(const char *name, unsigned int weak,
194 struct symbol *s = NOFAIL(malloc(sizeof(*s) + strlen(name) + 1));
196 memset(s, 0, sizeof(*s));
197 strcpy(s->name, name);
203 /* For the hash of exported symbols */
204 static struct symbol *new_symbol(const char *name, struct module *module,
210 hash = tdb_hash(name) % SYMBOL_HASH_SIZE;
211 new = symbolhash[hash] = alloc_symbol(name, 0, symbolhash[hash]);
212 new->module = module;
213 new->export = export;
217 static struct symbol *find_symbol(const char *name)
221 /* For our purposes, .foo matches foo. PPC64 needs this. */
225 for (s = symbolhash[tdb_hash(name) % SYMBOL_HASH_SIZE]; s; s = s->next) {
226 if (strcmp(s->name, name) == 0)
232 static const struct {
236 { .str = "EXPORT_SYMBOL", .export = export_plain },
237 { .str = "EXPORT_UNUSED_SYMBOL", .export = export_unused },
238 { .str = "EXPORT_SYMBOL_GPL", .export = export_gpl },
239 { .str = "EXPORT_UNUSED_SYMBOL_GPL", .export = export_unused_gpl },
240 { .str = "EXPORT_SYMBOL_GPL_FUTURE", .export = export_gpl_future },
241 { .str = "(unknown)", .export = export_unknown },
245 static const char *export_str(enum export ex)
247 return export_list[ex].str;
250 static enum export export_no(const char *s)
255 return export_unknown;
256 for (i = 0; export_list[i].export != export_unknown; i++) {
257 if (strcmp(export_list[i].str, s) == 0)
258 return export_list[i].export;
260 return export_unknown;
263 static const char *sec_name(struct elf_info *elf, int secindex);
265 #define strstarts(str, prefix) (strncmp(str, prefix, strlen(prefix)) == 0)
267 static enum export export_from_secname(struct elf_info *elf, unsigned int sec)
269 const char *secname = sec_name(elf, sec);
271 if (strstarts(secname, "___ksymtab+"))
273 else if (strstarts(secname, "___ksymtab_unused+"))
274 return export_unused;
275 else if (strstarts(secname, "___ksymtab_gpl+"))
277 else if (strstarts(secname, "___ksymtab_unused_gpl+"))
278 return export_unused_gpl;
279 else if (strstarts(secname, "___ksymtab_gpl_future+"))
280 return export_gpl_future;
282 return export_unknown;
285 static enum export export_from_sec(struct elf_info *elf, unsigned int sec)
287 if (sec == elf->export_sec)
289 else if (sec == elf->export_unused_sec)
290 return export_unused;
291 else if (sec == elf->export_gpl_sec)
293 else if (sec == elf->export_unused_gpl_sec)
294 return export_unused_gpl;
295 else if (sec == elf->export_gpl_future_sec)
296 return export_gpl_future;
298 return export_unknown;
302 * Add an exported symbol - it may have already been added without a
303 * CRC, in this case just update the CRC
305 static struct symbol *sym_add_exported(const char *name, struct module *mod,
308 struct symbol *s = find_symbol(name);
311 s = new_symbol(name, mod, export);
314 warn("%s: '%s' exported twice. Previous export "
315 "was in %s%s\n", mod->name, name,
317 is_vmlinux(s->module->name) ?"":".ko");
319 /* In case Module.symvers was out of date */
324 s->vmlinux = is_vmlinux(mod->name);
330 static void sym_update_crc(const char *name, struct module *mod,
331 unsigned int crc, enum export export)
333 struct symbol *s = find_symbol(name);
336 s = new_symbol(name, mod, export);
337 /* Don't complain when we find it later. */
344 void *grab_file(const char *filename, unsigned long *size)
347 void *map = MAP_FAILED;
350 fd = open(filename, O_RDONLY);
357 map = mmap(NULL, *size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
361 if (map == MAP_FAILED)
367 * Return a copy of the next line in a mmap'ed file.
368 * spaces in the beginning of the line is trimmed away.
369 * Return a pointer to a static buffer.
371 char *get_next_line(unsigned long *pos, void *file, unsigned long size)
373 static char line[4096];
376 signed char *p = (signed char *)file + *pos;
379 for (; *pos < size ; (*pos)++) {
380 if (skip && isspace(*p)) {
385 if (*p != '\n' && (*pos < size)) {
389 break; /* Too long, stop */
400 void release_file(void *file, unsigned long size)
405 static int parse_elf(struct elf_info *info, const char *filename)
411 const char *secstrings;
412 unsigned int symtab_idx = ~0U, symtab_shndx_idx = ~0U;
414 hdr = grab_file(filename, &info->size);
416 if (ignore_missing_files) {
417 fprintf(stderr, "%s: %s (ignored)\n", filename,
425 if (info->size < sizeof(*hdr)) {
426 /* file too small, assume this is an empty .o file */
429 /* Is this a valid ELF file? */
430 if ((hdr->e_ident[EI_MAG0] != ELFMAG0) ||
431 (hdr->e_ident[EI_MAG1] != ELFMAG1) ||
432 (hdr->e_ident[EI_MAG2] != ELFMAG2) ||
433 (hdr->e_ident[EI_MAG3] != ELFMAG3)) {
434 /* Not an ELF file - silently ignore it */
437 /* Fix endianness in ELF header */
438 hdr->e_type = TO_NATIVE(hdr->e_type);
439 hdr->e_machine = TO_NATIVE(hdr->e_machine);
440 hdr->e_version = TO_NATIVE(hdr->e_version);
441 hdr->e_entry = TO_NATIVE(hdr->e_entry);
442 hdr->e_phoff = TO_NATIVE(hdr->e_phoff);
443 hdr->e_shoff = TO_NATIVE(hdr->e_shoff);
444 hdr->e_flags = TO_NATIVE(hdr->e_flags);
445 hdr->e_ehsize = TO_NATIVE(hdr->e_ehsize);
446 hdr->e_phentsize = TO_NATIVE(hdr->e_phentsize);
447 hdr->e_phnum = TO_NATIVE(hdr->e_phnum);
448 hdr->e_shentsize = TO_NATIVE(hdr->e_shentsize);
449 hdr->e_shnum = TO_NATIVE(hdr->e_shnum);
450 hdr->e_shstrndx = TO_NATIVE(hdr->e_shstrndx);
451 sechdrs = (void *)hdr + hdr->e_shoff;
452 info->sechdrs = sechdrs;
454 /* Check if file offset is correct */
455 if (hdr->e_shoff > info->size) {
456 fatal("section header offset=%lu in file '%s' is bigger than "
457 "filesize=%lu\n", (unsigned long)hdr->e_shoff,
458 filename, info->size);
462 if (hdr->e_shnum == SHN_UNDEF) {
464 * There are more than 64k sections,
465 * read count from .sh_size.
467 info->num_sections = TO_NATIVE(sechdrs[0].sh_size);
470 info->num_sections = hdr->e_shnum;
472 if (hdr->e_shstrndx == SHN_XINDEX) {
473 info->secindex_strings = TO_NATIVE(sechdrs[0].sh_link);
476 info->secindex_strings = hdr->e_shstrndx;
479 /* Fix endianness in section headers */
480 for (i = 0; i < info->num_sections; i++) {
481 sechdrs[i].sh_name = TO_NATIVE(sechdrs[i].sh_name);
482 sechdrs[i].sh_type = TO_NATIVE(sechdrs[i].sh_type);
483 sechdrs[i].sh_flags = TO_NATIVE(sechdrs[i].sh_flags);
484 sechdrs[i].sh_addr = TO_NATIVE(sechdrs[i].sh_addr);
485 sechdrs[i].sh_offset = TO_NATIVE(sechdrs[i].sh_offset);
486 sechdrs[i].sh_size = TO_NATIVE(sechdrs[i].sh_size);
487 sechdrs[i].sh_link = TO_NATIVE(sechdrs[i].sh_link);
488 sechdrs[i].sh_info = TO_NATIVE(sechdrs[i].sh_info);
489 sechdrs[i].sh_addralign = TO_NATIVE(sechdrs[i].sh_addralign);
490 sechdrs[i].sh_entsize = TO_NATIVE(sechdrs[i].sh_entsize);
492 /* Find symbol table. */
493 secstrings = (void *)hdr + sechdrs[info->secindex_strings].sh_offset;
494 for (i = 1; i < info->num_sections; i++) {
496 int nobits = sechdrs[i].sh_type == SHT_NOBITS;
498 if (!nobits && sechdrs[i].sh_offset > info->size) {
499 fatal("%s is truncated. sechdrs[i].sh_offset=%lu > "
500 "sizeof(*hrd)=%zu\n", filename,
501 (unsigned long)sechdrs[i].sh_offset,
505 secname = secstrings + sechdrs[i].sh_name;
506 if (strcmp(secname, ".modinfo") == 0) {
508 fatal("%s has NOBITS .modinfo\n", filename);
509 info->modinfo = (void *)hdr + sechdrs[i].sh_offset;
510 info->modinfo_len = sechdrs[i].sh_size;
511 } else if (strcmp(secname, "__ksymtab") == 0)
512 info->export_sec = i;
513 else if (strcmp(secname, "__ksymtab_unused") == 0)
514 info->export_unused_sec = i;
515 else if (strcmp(secname, "__ksymtab_gpl") == 0)
516 info->export_gpl_sec = i;
517 else if (strcmp(secname, "__ksymtab_unused_gpl") == 0)
518 info->export_unused_gpl_sec = i;
519 else if (strcmp(secname, "__ksymtab_gpl_future") == 0)
520 info->export_gpl_future_sec = i;
522 if (sechdrs[i].sh_type == SHT_SYMTAB) {
523 unsigned int sh_link_idx;
525 info->symtab_start = (void *)hdr +
526 sechdrs[i].sh_offset;
527 info->symtab_stop = (void *)hdr +
528 sechdrs[i].sh_offset + sechdrs[i].sh_size;
529 sh_link_idx = sechdrs[i].sh_link;
530 info->strtab = (void *)hdr +
531 sechdrs[sh_link_idx].sh_offset;
534 /* 32bit section no. table? ("more than 64k sections") */
535 if (sechdrs[i].sh_type == SHT_SYMTAB_SHNDX) {
536 symtab_shndx_idx = i;
537 info->symtab_shndx_start = (void *)hdr +
538 sechdrs[i].sh_offset;
539 info->symtab_shndx_stop = (void *)hdr +
540 sechdrs[i].sh_offset + sechdrs[i].sh_size;
543 if (!info->symtab_start)
544 fatal("%s has no symtab?\n", filename);
546 /* Fix endianness in symbols */
547 for (sym = info->symtab_start; sym < info->symtab_stop; sym++) {
548 sym->st_shndx = TO_NATIVE(sym->st_shndx);
549 sym->st_name = TO_NATIVE(sym->st_name);
550 sym->st_value = TO_NATIVE(sym->st_value);
551 sym->st_size = TO_NATIVE(sym->st_size);
554 if (symtab_shndx_idx != ~0U) {
556 if (symtab_idx != sechdrs[symtab_shndx_idx].sh_link)
557 fatal("%s: SYMTAB_SHNDX has bad sh_link: %u!=%u\n",
558 filename, sechdrs[symtab_shndx_idx].sh_link,
561 for (p = info->symtab_shndx_start; p < info->symtab_shndx_stop;
569 static void parse_elf_finish(struct elf_info *info)
571 release_file(info->hdr, info->size);
574 static int ignore_undef_symbol(struct elf_info *info, const char *symname)
576 /* ignore __this_module, it will be resolved shortly */
577 if (strcmp(symname, VMLINUX_SYMBOL_STR(__this_module)) == 0)
579 /* ignore global offset table */
580 if (strcmp(symname, "_GLOBAL_OFFSET_TABLE_") == 0)
582 if (info->hdr->e_machine == EM_PPC)
583 /* Special register function linked on all modules during final link of .ko */
584 if (strncmp(symname, "_restgpr_", sizeof("_restgpr_") - 1) == 0 ||
585 strncmp(symname, "_savegpr_", sizeof("_savegpr_") - 1) == 0 ||
586 strncmp(symname, "_rest32gpr_", sizeof("_rest32gpr_") - 1) == 0 ||
587 strncmp(symname, "_save32gpr_", sizeof("_save32gpr_") - 1) == 0 ||
588 strncmp(symname, "_restvr_", sizeof("_restvr_") - 1) == 0 ||
589 strncmp(symname, "_savevr_", sizeof("_savevr_") - 1) == 0)
591 if (info->hdr->e_machine == EM_PPC64)
592 /* Special register function linked on all modules during final link of .ko */
593 if (strncmp(symname, "_restgpr0_", sizeof("_restgpr0_") - 1) == 0 ||
594 strncmp(symname, "_savegpr0_", sizeof("_savegpr0_") - 1) == 0 ||
595 strncmp(symname, "_restvr_", sizeof("_restvr_") - 1) == 0 ||
596 strncmp(symname, "_savevr_", sizeof("_savevr_") - 1) == 0)
598 /* Do not ignore this symbol */
602 #define CRC_PFX VMLINUX_SYMBOL_STR(__crc_)
603 #define KSYMTAB_PFX VMLINUX_SYMBOL_STR(__ksymtab_)
605 static void handle_modversions(struct module *mod, struct elf_info *info,
606 Elf_Sym *sym, const char *symname)
611 if ((!is_vmlinux(mod->name) || mod->is_dot_o) &&
612 strncmp(symname, "__ksymtab", 9) == 0)
613 export = export_from_secname(info, get_secindex(info, sym));
615 export = export_from_sec(info, get_secindex(info, sym));
618 if (strncmp(symname, CRC_PFX, strlen(CRC_PFX)) == 0) {
619 crc = (unsigned int) sym->st_value;
620 sym_update_crc(symname + strlen(CRC_PFX), mod, crc,
624 switch (sym->st_shndx) {
626 if (!strncmp(symname, "__gnu_lto_", sizeof("__gnu_lto_")-1)) {
627 /* Should warn here, but modpost runs before the linker */
629 warn("\"%s\" [%s] is COMMON symbol\n", symname, mod->name);
632 /* undefined symbol */
633 if (ELF_ST_BIND(sym->st_info) != STB_GLOBAL &&
634 ELF_ST_BIND(sym->st_info) != STB_WEAK)
636 if (ignore_undef_symbol(info, symname))
638 /* cope with newer glibc (2.3.4 or higher) STT_ definition in elf.h */
639 #if defined(STT_REGISTER) || defined(STT_SPARC_REGISTER)
640 /* add compatibility with older glibc */
641 #ifndef STT_SPARC_REGISTER
642 #define STT_SPARC_REGISTER STT_REGISTER
644 if (info->hdr->e_machine == EM_SPARC ||
645 info->hdr->e_machine == EM_SPARCV9) {
646 /* Ignore register directives. */
647 if (ELF_ST_TYPE(sym->st_info) == STT_SPARC_REGISTER)
649 if (symname[0] == '.') {
650 char *munged = strdup(symname);
652 munged[1] = toupper(munged[1]);
658 #ifdef CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX
659 if (symname[0] != '_')
664 mod->unres = alloc_symbol(symname,
665 ELF_ST_BIND(sym->st_info) == STB_WEAK,
669 /* All exported symbols */
670 if (strncmp(symname, KSYMTAB_PFX, strlen(KSYMTAB_PFX)) == 0) {
671 sym_add_exported(symname + strlen(KSYMTAB_PFX), mod,
674 if (strcmp(symname, VMLINUX_SYMBOL_STR(init_module)) == 0)
676 if (strcmp(symname, VMLINUX_SYMBOL_STR(cleanup_module)) == 0)
677 mod->has_cleanup = 1;
683 * Parse tag=value strings from .modinfo section
685 static char *next_string(char *string, unsigned long *secsize)
687 /* Skip non-zero chars */
690 if ((*secsize)-- <= 1)
694 /* Skip any zero padding. */
697 if ((*secsize)-- <= 1)
703 static char *get_next_modinfo(void *modinfo, unsigned long modinfo_len,
704 const char *tag, char *info)
707 unsigned int taglen = strlen(tag);
708 unsigned long size = modinfo_len;
711 size -= info - (char *)modinfo;
712 modinfo = next_string(info, &size);
715 for (p = modinfo; p; p = next_string(p, &size)) {
716 if (strncmp(p, tag, taglen) == 0 && p[taglen] == '=')
717 return p + taglen + 1;
722 static char *get_modinfo(void *modinfo, unsigned long modinfo_len,
726 return get_next_modinfo(modinfo, modinfo_len, tag, NULL);
730 * Test if string s ends in string sub
733 static int strrcmp(const char *s, const char *sub)
741 sublen = strlen(sub);
743 if ((slen == 0) || (sublen == 0))
749 return memcmp(s + slen - sublen, sub, sublen);
752 static const char *sym_name(struct elf_info *elf, Elf_Sym *sym)
755 return elf->strtab + sym->st_name;
760 static const char *sec_name(struct elf_info *elf, int secindex)
762 Elf_Shdr *sechdrs = elf->sechdrs;
763 return (void *)elf->hdr +
764 elf->sechdrs[elf->secindex_strings].sh_offset +
765 sechdrs[secindex].sh_name;
768 static const char *sech_name(struct elf_info *elf, Elf_Shdr *sechdr)
770 return (void *)elf->hdr +
771 elf->sechdrs[elf->secindex_strings].sh_offset +
775 /* The pattern is an array of simple patterns.
776 * "foo" will match an exact string equal to "foo"
777 * "*foo" will match a string that ends with "foo"
778 * "foo*" will match a string that begins with "foo"
780 static int match(const char *sym, const char * const pat[])
785 const char *endp = p + strlen(p) - 1;
789 if (strrcmp(sym, p + 1) == 0)
793 else if (*endp == '*') {
794 if (strncmp(sym, p, strlen(p) - 1) == 0)
799 if (strcmp(p, sym) == 0)
807 /* sections that we do not want to do full section mismatch check on */
808 static const char *const section_white_list[] =
812 ".cranges", /* sh64 */
813 ".zdebug*", /* Compressed debug sections. */
814 ".GCC-command-line", /* mn10300 */
815 ".GCC.command.line", /* record-gcc-switches, non mn10300 */
816 ".mdebug*", /* alpha, score, mips etc. */
817 ".pdr", /* alpha, score, mips etc. */
822 ".xt.prop", /* xtensa */
823 ".xt.lit", /* xtensa */
824 ".arcextmap*", /* arc */
825 ".gnu.linkonce.arcext*", /* arc : modules */
831 * This is used to find sections missing the SHF_ALLOC flag.
832 * The cause of this is often a section specified in assembler
833 * without "ax" / "aw".
835 static void check_section(const char *modname, struct elf_info *elf,
838 const char *sec = sech_name(elf, sechdr);
840 if (sechdr->sh_type == SHT_PROGBITS &&
841 !(sechdr->sh_flags & SHF_ALLOC) &&
842 !match(sec, section_white_list)) {
843 warn("%s (%s): unexpected non-allocatable section.\n"
844 "Did you forget to use \"ax\"/\"aw\" in a .S file?\n"
845 "Note that for example <linux/init.h> contains\n"
846 "section definitions for use in .S files.\n\n",
853 #define ALL_INIT_DATA_SECTIONS \
854 ".init.setup", ".init.rodata", ".meminit.rodata", \
855 ".init.data", ".meminit.data"
856 #define ALL_EXIT_DATA_SECTIONS \
857 ".exit.data", ".memexit.data"
859 #define ALL_INIT_TEXT_SECTIONS \
860 ".init.text", ".meminit.text"
861 #define ALL_EXIT_TEXT_SECTIONS \
862 ".exit.text", ".memexit.text"
864 #define ALL_PCI_INIT_SECTIONS \
865 ".pci_fixup_early", ".pci_fixup_header", ".pci_fixup_final", \
866 ".pci_fixup_enable", ".pci_fixup_resume", \
867 ".pci_fixup_resume_early", ".pci_fixup_suspend"
869 #define ALL_XXXINIT_SECTIONS MEM_INIT_SECTIONS
870 #define ALL_XXXEXIT_SECTIONS MEM_EXIT_SECTIONS
872 #define ALL_INIT_SECTIONS INIT_SECTIONS, ALL_XXXINIT_SECTIONS
873 #define ALL_EXIT_SECTIONS EXIT_SECTIONS, ALL_XXXEXIT_SECTIONS
875 #define DATA_SECTIONS ".data", ".data.rel"
876 #define TEXT_SECTIONS ".text", ".text.unlikely", ".sched.text", \
878 #define OTHER_TEXT_SECTIONS ".ref.text", ".head.text", ".spinlock.text", \
879 ".fixup", ".entry.text", ".exception.text", ".text.*"
881 #define INIT_SECTIONS ".init.*"
882 #define MEM_INIT_SECTIONS ".meminit.*"
884 #define EXIT_SECTIONS ".exit.*"
885 #define MEM_EXIT_SECTIONS ".memexit.*"
887 #define ALL_TEXT_SECTIONS ALL_INIT_TEXT_SECTIONS, ALL_EXIT_TEXT_SECTIONS, \
888 TEXT_SECTIONS, OTHER_TEXT_SECTIONS
890 /* init data sections */
891 static const char *const init_data_sections[] =
892 { ALL_INIT_DATA_SECTIONS, NULL };
894 /* all init sections */
895 static const char *const init_sections[] = { ALL_INIT_SECTIONS, NULL };
897 /* All init and exit sections (code + data) */
898 static const char *const init_exit_sections[] =
899 {ALL_INIT_SECTIONS, ALL_EXIT_SECTIONS, NULL };
902 static const char *const data_sections[] = { DATA_SECTIONS, NULL };
905 /* symbols in .data that may refer to init/exit sections */
906 #define DEFAULT_SYMBOL_WHITE_LIST \
908 "*_template", /* scsi uses *_template a lot */ \
909 "*_timer", /* arm uses ops structures named _timer a lot */ \
910 "*_sht", /* scsi also used *_sht to some extent */ \
916 static const char *const head_sections[] = { ".head.text*", NULL };
917 static const char *const linker_symbols[] =
918 { "__init_begin", "_sinittext", "_einittext", NULL };
925 XXXINIT_TO_SOME_INIT,
926 XXXEXIT_TO_SOME_EXIT,
927 ANY_INIT_TO_ANY_EXIT,
928 ANY_EXIT_TO_ANY_INIT,
934 * Describe how to match sections on different criterias:
936 * @fromsec: Array of sections to be matched.
938 * @bad_tosec: Relocations applied to a section in @fromsec to a section in
939 * this array is forbidden (black-list). Can be empty.
941 * @good_tosec: Relocations applied to a section in @fromsec must be
942 * targetting sections in this array (white-list). Can be empty.
944 * @mismatch: Type of mismatch.
946 * @symbol_white_list: Do not match a relocation to a symbol in this list
947 * even if it is targetting a section in @bad_to_sec.
949 * @handler: Specific handler to call when a match is found. If NULL,
950 * default_mismatch_handler() will be called.
953 struct sectioncheck {
954 const char *fromsec[20];
955 const char *bad_tosec[20];
956 const char *good_tosec[20];
957 enum mismatch mismatch;
958 const char *symbol_white_list[20];
959 void (*handler)(const char *modname, struct elf_info *elf,
960 const struct sectioncheck* const mismatch,
961 Elf_Rela *r, Elf_Sym *sym, const char *fromsec);
965 static void extable_mismatch_handler(const char *modname, struct elf_info *elf,
966 const struct sectioncheck* const mismatch,
967 Elf_Rela *r, Elf_Sym *sym,
968 const char *fromsec);
970 static const struct sectioncheck sectioncheck[] = {
971 /* Do not reference init/exit code/data from
972 * normal code and data
975 .fromsec = { TEXT_SECTIONS, NULL },
976 .bad_tosec = { ALL_INIT_SECTIONS, NULL },
977 .mismatch = TEXT_TO_ANY_INIT,
978 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
981 .fromsec = { DATA_SECTIONS, NULL },
982 .bad_tosec = { ALL_XXXINIT_SECTIONS, NULL },
983 .mismatch = DATA_TO_ANY_INIT,
984 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
987 .fromsec = { DATA_SECTIONS, NULL },
988 .bad_tosec = { INIT_SECTIONS, NULL },
989 .mismatch = DATA_TO_ANY_INIT,
990 .symbol_white_list = {
991 "*_template", "*_timer", "*_sht", "*_ops",
992 "*_probe", "*_probe_one", "*_console", NULL
996 .fromsec = { TEXT_SECTIONS, NULL },
997 .bad_tosec = { ALL_EXIT_SECTIONS, NULL },
998 .mismatch = TEXT_TO_ANY_EXIT,
999 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1002 .fromsec = { DATA_SECTIONS, NULL },
1003 .bad_tosec = { ALL_EXIT_SECTIONS, NULL },
1004 .mismatch = DATA_TO_ANY_EXIT,
1005 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1007 /* Do not reference init code/data from meminit code/data */
1009 .fromsec = { ALL_XXXINIT_SECTIONS, NULL },
1010 .bad_tosec = { INIT_SECTIONS, NULL },
1011 .mismatch = XXXINIT_TO_SOME_INIT,
1012 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1014 /* Do not reference exit code/data from memexit code/data */
1016 .fromsec = { ALL_XXXEXIT_SECTIONS, NULL },
1017 .bad_tosec = { EXIT_SECTIONS, NULL },
1018 .mismatch = XXXEXIT_TO_SOME_EXIT,
1019 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1021 /* Do not use exit code/data from init code */
1023 .fromsec = { ALL_INIT_SECTIONS, NULL },
1024 .bad_tosec = { ALL_EXIT_SECTIONS, NULL },
1025 .mismatch = ANY_INIT_TO_ANY_EXIT,
1026 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1028 /* Do not use init code/data from exit code */
1030 .fromsec = { ALL_EXIT_SECTIONS, NULL },
1031 .bad_tosec = { ALL_INIT_SECTIONS, NULL },
1032 .mismatch = ANY_EXIT_TO_ANY_INIT,
1033 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1036 .fromsec = { ALL_PCI_INIT_SECTIONS, NULL },
1037 .bad_tosec = { INIT_SECTIONS, NULL },
1038 .mismatch = ANY_INIT_TO_ANY_EXIT,
1039 .symbol_white_list = { NULL },
1041 /* Do not export init/exit functions or data */
1043 .fromsec = { "__ksymtab*", NULL },
1044 .bad_tosec = { INIT_SECTIONS, EXIT_SECTIONS, NULL },
1045 .mismatch = EXPORT_TO_INIT_EXIT,
1046 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1049 .fromsec = { "__ex_table", NULL },
1050 /* If you're adding any new black-listed sections in here, consider
1051 * adding a special 'printer' for them in scripts/check_extable.
1053 .bad_tosec = { ".altinstr_replacement", NULL },
1054 .good_tosec = {ALL_TEXT_SECTIONS , NULL},
1055 .mismatch = EXTABLE_TO_NON_TEXT,
1056 .handler = extable_mismatch_handler,
1060 static const struct sectioncheck *section_mismatch(
1061 const char *fromsec, const char *tosec)
1064 int elems = sizeof(sectioncheck) / sizeof(struct sectioncheck);
1065 const struct sectioncheck *check = §ioncheck[0];
1067 for (i = 0; i < elems; i++) {
1068 if (match(fromsec, check->fromsec)) {
1069 if (check->bad_tosec[0] && match(tosec, check->bad_tosec))
1071 if (check->good_tosec[0] && !match(tosec, check->good_tosec))
1080 * Whitelist to allow certain references to pass with no warning.
1083 * If a module parameter is declared __initdata and permissions=0
1084 * then this is legal despite the warning generated.
1085 * We cannot see value of permissions here, so just ignore
1087 * The pattern is identified by:
1088 * tosec = .init.data
1093 * module_param_call() ops can refer to __init set function if permissions=0
1094 * The pattern is identified by:
1095 * tosec = .init.text
1097 * atsym = __param_ops_*
1100 * Many drivers utilise a *driver container with references to
1101 * add, remove, probe functions etc.
1102 * the pattern is identified by:
1103 * tosec = init or exit section
1104 * fromsec = data section
1105 * atsym = *driver, *_template, *_sht, *_ops, *_probe,
1106 * *probe_one, *_console, *_timer
1109 * Whitelist all references from .head.text to any init section
1112 * Some symbols belong to init section but still it is ok to reference
1113 * these from non-init sections as these symbols don't have any memory
1114 * allocated for them and symbol address and value are same. So even
1115 * if init section is freed, its ok to reference those symbols.
1116 * For ex. symbols marking the init section boundaries.
1117 * This pattern is identified by
1118 * refsymname = __init_begin, _sinittext, _einittext
1121 static int secref_whitelist(const struct sectioncheck *mismatch,
1122 const char *fromsec, const char *fromsym,
1123 const char *tosec, const char *tosym)
1125 /* Check for pattern 1 */
1126 if (match(tosec, init_data_sections) &&
1127 match(fromsec, data_sections) &&
1128 (strncmp(fromsym, "__param", strlen("__param")) == 0))
1131 /* Check for pattern 1a */
1132 if (strcmp(tosec, ".init.text") == 0 &&
1133 match(fromsec, data_sections) &&
1134 (strncmp(fromsym, "__param_ops_", strlen("__param_ops_")) == 0))
1137 /* Check for pattern 2 */
1138 if (match(tosec, init_exit_sections) &&
1139 match(fromsec, data_sections) &&
1140 match(fromsym, mismatch->symbol_white_list))
1143 /* Check for pattern 3 */
1144 if (match(fromsec, head_sections) &&
1145 match(tosec, init_sections))
1148 /* Check for pattern 4 */
1149 if (match(tosym, linker_symbols))
1156 * Find symbol based on relocation record info.
1157 * In some cases the symbol supplied is a valid symbol so
1158 * return refsym. If st_name != 0 we assume this is a valid symbol.
1159 * In other cases the symbol needs to be looked up in the symbol table
1160 * based on section and address.
1162 static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr,
1166 Elf_Sym *near = NULL;
1167 Elf64_Sword distance = 20;
1169 unsigned int relsym_secindex;
1171 if (relsym->st_name != 0)
1174 relsym_secindex = get_secindex(elf, relsym);
1175 for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
1176 if (get_secindex(elf, sym) != relsym_secindex)
1178 if (ELF_ST_TYPE(sym->st_info) == STT_SECTION)
1180 if (sym->st_value == addr)
1182 /* Find a symbol nearby - addr are maybe negative */
1183 d = sym->st_value - addr;
1185 d = addr - sym->st_value;
1191 /* We need a close match */
1198 static inline int is_arm_mapping_symbol(const char *str)
1200 return str[0] == '$' && strchr("axtd", str[1])
1201 && (str[2] == '\0' || str[2] == '.');
1205 * If there's no name there, ignore it; likewise, ignore it if it's
1206 * one of the magic symbols emitted used by current ARM tools.
1208 * Otherwise if find_symbols_between() returns those symbols, they'll
1209 * fail the whitelist tests and cause lots of false alarms ... fixable
1210 * only by merging __exit and __init sections into __text, bloating
1211 * the kernel (which is especially evil on embedded platforms).
1213 static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym)
1215 const char *name = elf->strtab + sym->st_name;
1217 if (!name || !strlen(name))
1219 return !is_arm_mapping_symbol(name);
1223 * Find symbols before or equal addr and after addr - in the section sec.
1224 * If we find two symbols with equal offset prefer one with a valid name.
1225 * The ELF format may have a better way to detect what type of symbol
1226 * it is, but this works for now.
1228 static Elf_Sym *find_elf_symbol2(struct elf_info *elf, Elf_Addr addr,
1232 Elf_Sym *near = NULL;
1233 Elf_Addr distance = ~0;
1235 for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
1238 if (is_shndx_special(sym->st_shndx))
1240 symsec = sec_name(elf, get_secindex(elf, sym));
1241 if (strcmp(symsec, sec) != 0)
1243 if (!is_valid_name(elf, sym))
1245 if (sym->st_value <= addr) {
1246 if ((addr - sym->st_value) < distance) {
1247 distance = addr - sym->st_value;
1249 } else if ((addr - sym->st_value) == distance) {
1258 * Convert a section name to the function/data attribute
1259 * .init.text => __init
1260 * .memexitconst => __memconst
1263 * The memory of returned value has been allocated on a heap. The user of this
1264 * method should free it after usage.
1266 static char *sec2annotation(const char *s)
1268 if (match(s, init_exit_sections)) {
1269 char *p = malloc(20);
1276 while (*s && *s != '.')
1281 if (strstr(s, "rodata") != NULL)
1282 strcat(p, "const ");
1283 else if (strstr(s, "data") != NULL)
1293 static int is_function(Elf_Sym *sym)
1296 return ELF_ST_TYPE(sym->st_info) == STT_FUNC;
1301 static void print_section_list(const char * const list[20])
1303 const char *const *s = list;
1306 fprintf(stderr, "%s", *s);
1309 fprintf(stderr, ", ");
1311 fprintf(stderr, "\n");
1314 static inline void get_pretty_name(int is_func, const char** name, const char** name_p)
1317 case 0: *name = "variable"; *name_p = ""; break;
1318 case 1: *name = "function"; *name_p = "()"; break;
1319 default: *name = "(unknown reference)"; *name_p = ""; break;
1324 * Print a warning about a section mismatch.
1325 * Try to find symbols near it so user can find it.
1326 * Check whitelist before warning - it may be a false positive.
1328 static void report_sec_mismatch(const char *modname,
1329 const struct sectioncheck *mismatch,
1330 const char *fromsec,
1331 unsigned long long fromaddr,
1332 const char *fromsym,
1334 const char *tosec, const char *tosym,
1337 const char *from, *from_p;
1338 const char *to, *to_p;
1342 sec_mismatch_count++;
1343 if (!sec_mismatch_verbose)
1346 get_pretty_name(from_is_func, &from, &from_p);
1347 get_pretty_name(to_is_func, &to, &to_p);
1349 warn("%s(%s+0x%llx): Section mismatch in reference from the %s %s%s "
1350 "to the %s %s:%s%s\n",
1351 modname, fromsec, fromaddr, from, fromsym, from_p, to, tosec,
1354 switch (mismatch->mismatch) {
1355 case TEXT_TO_ANY_INIT:
1356 prl_from = sec2annotation(fromsec);
1357 prl_to = sec2annotation(tosec);
1359 "The function %s%s() references\n"
1361 "This is often because %s lacks a %s\n"
1362 "annotation or the annotation of %s is wrong.\n",
1364 to, prl_to, tosym, to_p,
1365 fromsym, prl_to, tosym);
1369 case DATA_TO_ANY_INIT: {
1370 prl_to = sec2annotation(tosec);
1372 "The variable %s references\n"
1374 "If the reference is valid then annotate the\n"
1375 "variable with __init* or __refdata (see linux/init.h) "
1376 "or name the variable:\n",
1377 fromsym, to, prl_to, tosym, to_p);
1378 print_section_list(mismatch->symbol_white_list);
1382 case TEXT_TO_ANY_EXIT:
1383 prl_to = sec2annotation(tosec);
1385 "The function %s() references a %s in an exit section.\n"
1386 "Often the %s %s%s has valid usage outside the exit section\n"
1387 "and the fix is to remove the %sannotation of %s.\n",
1388 fromsym, to, to, tosym, to_p, prl_to, tosym);
1391 case DATA_TO_ANY_EXIT: {
1392 prl_to = sec2annotation(tosec);
1394 "The variable %s references\n"
1396 "If the reference is valid then annotate the\n"
1397 "variable with __exit* (see linux/init.h) or "
1398 "name the variable:\n",
1399 fromsym, to, prl_to, tosym, to_p);
1400 print_section_list(mismatch->symbol_white_list);
1404 case XXXINIT_TO_SOME_INIT:
1405 case XXXEXIT_TO_SOME_EXIT:
1406 prl_from = sec2annotation(fromsec);
1407 prl_to = sec2annotation(tosec);
1409 "The %s %s%s%s references\n"
1411 "If %s is only used by %s then\n"
1412 "annotate %s with a matching annotation.\n",
1413 from, prl_from, fromsym, from_p,
1414 to, prl_to, tosym, to_p,
1415 tosym, fromsym, tosym);
1419 case ANY_INIT_TO_ANY_EXIT:
1420 prl_from = sec2annotation(fromsec);
1421 prl_to = sec2annotation(tosec);
1423 "The %s %s%s%s references\n"
1425 "This is often seen when error handling "
1426 "in the init function\n"
1427 "uses functionality in the exit path.\n"
1428 "The fix is often to remove the %sannotation of\n"
1429 "%s%s so it may be used outside an exit section.\n",
1430 from, prl_from, fromsym, from_p,
1431 to, prl_to, tosym, to_p,
1432 prl_to, tosym, to_p);
1436 case ANY_EXIT_TO_ANY_INIT:
1437 prl_from = sec2annotation(fromsec);
1438 prl_to = sec2annotation(tosec);
1440 "The %s %s%s%s references\n"
1442 "This is often seen when error handling "
1443 "in the exit function\n"
1444 "uses functionality in the init path.\n"
1445 "The fix is often to remove the %sannotation of\n"
1446 "%s%s so it may be used outside an init section.\n",
1447 from, prl_from, fromsym, from_p,
1448 to, prl_to, tosym, to_p,
1449 prl_to, tosym, to_p);
1453 case EXPORT_TO_INIT_EXIT:
1454 prl_to = sec2annotation(tosec);
1456 "The symbol %s is exported and annotated %s\n"
1457 "Fix this by removing the %sannotation of %s "
1458 "or drop the export.\n",
1459 tosym, prl_to, prl_to, tosym);
1462 case EXTABLE_TO_NON_TEXT:
1463 fatal("There's a special handler for this mismatch type, "
1464 "we should never get here.");
1467 fprintf(stderr, "\n");
1470 static void default_mismatch_handler(const char *modname, struct elf_info *elf,
1471 const struct sectioncheck* const mismatch,
1472 Elf_Rela *r, Elf_Sym *sym, const char *fromsec)
1478 const char *fromsym;
1480 from = find_elf_symbol2(elf, r->r_offset, fromsec);
1481 fromsym = sym_name(elf, from);
1483 if (!strncmp(fromsym, "reference___initcall",
1484 sizeof("reference___initcall")-1))
1487 tosec = sec_name(elf, get_secindex(elf, sym));
1488 to = find_elf_symbol(elf, r->r_addend, sym);
1489 tosym = sym_name(elf, to);
1491 /* check whitelist - we may ignore it */
1492 if (secref_whitelist(mismatch,
1493 fromsec, fromsym, tosec, tosym)) {
1494 report_sec_mismatch(modname, mismatch,
1495 fromsec, r->r_offset, fromsym,
1496 is_function(from), tosec, tosym,
1501 static int is_executable_section(struct elf_info* elf, unsigned int section_index)
1503 if (section_index > elf->num_sections)
1504 fatal("section_index is outside elf->num_sections!\n");
1506 return ((elf->sechdrs[section_index].sh_flags & SHF_EXECINSTR) == SHF_EXECINSTR);
1510 * We rely on a gross hack in section_rel[a]() calling find_extable_entry_size()
1511 * to know the sizeof(struct exception_table_entry) for the target architecture.
1513 static unsigned int extable_entry_size = 0;
1514 static void find_extable_entry_size(const char* const sec, const Elf_Rela* r,
1515 const void* start, const void* cur)
1518 * If we're currently checking the second relocation within __ex_table,
1519 * that relocation offset tells us the offsetof(struct
1520 * exception_table_entry, fixup) which is equal to sizeof(struct
1521 * exception_table_entry) divided by two. We use that to our advantage
1522 * since there's no portable way to get that size as every architecture
1523 * seems to go with different sized types. Not pretty but better than
1524 * hard-coding the size for every architecture..
1526 if (!extable_entry_size && cur == start + 1 &&
1527 strcmp("__ex_table", sec) == 0)
1528 extable_entry_size = r->r_offset * 2;
1530 static inline bool is_extable_fault_address(Elf_Rela *r)
1533 * extable_entry_size is only discovered after we've handled the
1534 * _second_ relocation in __ex_table, so only abort when we're not
1535 * handling the first reloc and extable_entry_size is zero.
1537 if (r->r_offset && extable_entry_size == 0)
1538 fatal("extable_entry size hasn't been discovered!\n");
1540 return ((r->r_offset == 0) ||
1541 (r->r_offset % extable_entry_size == 0));
1544 static void report_extable_warnings(const char* modname, struct elf_info* elf,
1545 const struct sectioncheck* const mismatch,
1546 Elf_Rela* r, Elf_Sym* sym,
1547 const char* fromsec, const char* tosec)
1549 Elf_Sym* fromsym = find_elf_symbol2(elf, r->r_offset, fromsec);
1550 const char* fromsym_name = sym_name(elf, fromsym);
1551 Elf_Sym* tosym = find_elf_symbol(elf, r->r_addend, sym);
1552 const char* tosym_name = sym_name(elf, tosym);
1553 const char* from_pretty_name;
1554 const char* from_pretty_name_p;
1555 const char* to_pretty_name;
1556 const char* to_pretty_name_p;
1558 get_pretty_name(is_function(fromsym),
1559 &from_pretty_name, &from_pretty_name_p);
1560 get_pretty_name(is_function(tosym),
1561 &to_pretty_name, &to_pretty_name_p);
1563 warn("%s(%s+0x%lx): Section mismatch in reference"
1564 " from the %s %s%s to the %s %s:%s%s\n",
1565 modname, fromsec, (long)r->r_offset, from_pretty_name,
1566 fromsym_name, from_pretty_name_p,
1567 to_pretty_name, tosec, tosym_name, to_pretty_name_p);
1569 if (!match(tosec, mismatch->bad_tosec) &&
1570 is_executable_section(elf, get_secindex(elf, sym)))
1572 "The relocation at %s+0x%lx references\n"
1573 "section \"%s\" which is not in the list of\n"
1574 "authorized sections. If you're adding a new section\n"
1575 "and/or if this reference is valid, add \"%s\" to the\n"
1576 "list of authorized sections to jump to on fault.\n"
1577 "This can be achieved by adding \"%s\" to \n"
1578 "OTHER_TEXT_SECTIONS in scripts/mod/modpost.c.\n",
1579 fromsec, (long)r->r_offset, tosec, tosec, tosec);
1582 static void extable_mismatch_handler(const char* modname, struct elf_info *elf,
1583 const struct sectioncheck* const mismatch,
1584 Elf_Rela* r, Elf_Sym* sym,
1585 const char *fromsec)
1587 const char* tosec = sec_name(elf, get_secindex(elf, sym));
1589 sec_mismatch_count++;
1591 if (sec_mismatch_verbose)
1592 report_extable_warnings(modname, elf, mismatch, r, sym,
1595 if (match(tosec, mismatch->bad_tosec))
1596 fatal("The relocation at %s+0x%lx references\n"
1597 "section \"%s\" which is black-listed.\n"
1598 "Something is seriously wrong and should be fixed.\n"
1599 "You might get more information about where this is\n"
1600 "coming from by using scripts/check_extable.sh %s\n",
1601 fromsec, (long)r->r_offset, tosec, modname);
1602 else if (!is_executable_section(elf, get_secindex(elf, sym))) {
1603 if (is_extable_fault_address(r))
1604 fatal("The relocation at %s+0x%lx references\n"
1605 "section \"%s\" which is not executable, IOW\n"
1606 "it is not possible for the kernel to fault\n"
1607 "at that address. Something is seriously wrong\n"
1608 "and should be fixed.\n",
1609 fromsec, (long)r->r_offset, tosec);
1611 fatal("The relocation at %s+0x%lx references\n"
1612 "section \"%s\" which is not executable, IOW\n"
1613 "the kernel will fault if it ever tries to\n"
1614 "jump to it. Something is seriously wrong\n"
1615 "and should be fixed.\n",
1616 fromsec, (long)r->r_offset, tosec);
1620 static void check_section_mismatch(const char *modname, struct elf_info *elf,
1621 Elf_Rela *r, Elf_Sym *sym, const char *fromsec)
1623 const char *tosec = sec_name(elf, get_secindex(elf, sym));;
1624 const struct sectioncheck *mismatch = section_mismatch(fromsec, tosec);
1627 if (mismatch->handler)
1628 mismatch->handler(modname, elf, mismatch,
1631 default_mismatch_handler(modname, elf, mismatch,
1636 static unsigned int *reloc_location(struct elf_info *elf,
1637 Elf_Shdr *sechdr, Elf_Rela *r)
1639 Elf_Shdr *sechdrs = elf->sechdrs;
1640 int section = sechdr->sh_info;
1642 return (void *)elf->hdr + sechdrs[section].sh_offset +
1646 static int addend_386_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1648 unsigned int r_typ = ELF_R_TYPE(r->r_info);
1649 unsigned int *location = reloc_location(elf, sechdr, r);
1653 r->r_addend = TO_NATIVE(*location);
1656 r->r_addend = TO_NATIVE(*location) + 4;
1657 /* For CONFIG_RELOCATABLE=y */
1658 if (elf->hdr->e_type == ET_EXEC)
1659 r->r_addend += r->r_offset;
1666 #define R_ARM_CALL 28
1668 #ifndef R_ARM_JUMP24
1669 #define R_ARM_JUMP24 29
1672 #ifndef R_ARM_THM_CALL
1673 #define R_ARM_THM_CALL 10
1675 #ifndef R_ARM_THM_JUMP24
1676 #define R_ARM_THM_JUMP24 30
1678 #ifndef R_ARM_THM_JUMP19
1679 #define R_ARM_THM_JUMP19 51
1682 static int addend_arm_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1684 unsigned int r_typ = ELF_R_TYPE(r->r_info);
1688 /* From ARM ABI: (S + A) | T */
1689 r->r_addend = (int)(long)
1690 (elf->symtab_start + ELF_R_SYM(r->r_info));
1695 case R_ARM_THM_CALL:
1696 case R_ARM_THM_JUMP24:
1697 case R_ARM_THM_JUMP19:
1698 /* From ARM ABI: ((S + A) | T) - P */
1699 r->r_addend = (int)(long)(elf->hdr +
1701 (r->r_offset - sechdr->sh_addr));
1709 static int addend_mips_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1711 unsigned int r_typ = ELF_R_TYPE(r->r_info);
1712 unsigned int *location = reloc_location(elf, sechdr, r);
1715 if (r_typ == R_MIPS_HI16)
1716 return 1; /* skip this */
1717 inst = TO_NATIVE(*location);
1720 r->r_addend = inst & 0xffff;
1723 r->r_addend = (inst & 0x03ffffff) << 2;
1732 static void section_rela(const char *modname, struct elf_info *elf,
1739 const char *fromsec;
1741 Elf_Rela *start = (void *)elf->hdr + sechdr->sh_offset;
1742 Elf_Rela *stop = (void *)start + sechdr->sh_size;
1744 fromsec = sech_name(elf, sechdr);
1745 fromsec += strlen(".rela");
1746 /* if from section (name) is know good then skip it */
1747 if (match(fromsec, section_white_list))
1750 for (rela = start; rela < stop; rela++) {
1751 r.r_offset = TO_NATIVE(rela->r_offset);
1752 #if KERNEL_ELFCLASS == ELFCLASS64
1753 if (elf->hdr->e_machine == EM_MIPS) {
1755 r_sym = ELF64_MIPS_R_SYM(rela->r_info);
1756 r_sym = TO_NATIVE(r_sym);
1757 r_typ = ELF64_MIPS_R_TYPE(rela->r_info);
1758 r.r_info = ELF64_R_INFO(r_sym, r_typ);
1760 r.r_info = TO_NATIVE(rela->r_info);
1761 r_sym = ELF_R_SYM(r.r_info);
1764 r.r_info = TO_NATIVE(rela->r_info);
1765 r_sym = ELF_R_SYM(r.r_info);
1767 r.r_addend = TO_NATIVE(rela->r_addend);
1768 sym = elf->symtab_start + r_sym;
1769 /* Skip special sections */
1770 if (is_shndx_special(sym->st_shndx))
1772 find_extable_entry_size(fromsec, &r, start, rela);
1773 check_section_mismatch(modname, elf, &r, sym, fromsec);
1777 static void section_rel(const char *modname, struct elf_info *elf,
1784 const char *fromsec;
1786 Elf_Rel *start = (void *)elf->hdr + sechdr->sh_offset;
1787 Elf_Rel *stop = (void *)start + sechdr->sh_size;
1789 fromsec = sech_name(elf, sechdr);
1790 fromsec += strlen(".rel");
1791 /* if from section (name) is know good then skip it */
1792 if (match(fromsec, section_white_list))
1795 for (rel = start; rel < stop; rel++) {
1796 r.r_offset = TO_NATIVE(rel->r_offset);
1797 #if KERNEL_ELFCLASS == ELFCLASS64
1798 if (elf->hdr->e_machine == EM_MIPS) {
1800 r_sym = ELF64_MIPS_R_SYM(rel->r_info);
1801 r_sym = TO_NATIVE(r_sym);
1802 r_typ = ELF64_MIPS_R_TYPE(rel->r_info);
1803 r.r_info = ELF64_R_INFO(r_sym, r_typ);
1805 r.r_info = TO_NATIVE(rel->r_info);
1806 r_sym = ELF_R_SYM(r.r_info);
1809 r.r_info = TO_NATIVE(rel->r_info);
1810 r_sym = ELF_R_SYM(r.r_info);
1813 switch (elf->hdr->e_machine) {
1815 if (addend_386_rel(elf, sechdr, &r))
1819 if (addend_arm_rel(elf, sechdr, &r))
1823 if (addend_mips_rel(elf, sechdr, &r))
1827 sym = elf->symtab_start + r_sym;
1828 /* Skip special sections */
1829 if (is_shndx_special(sym->st_shndx))
1831 find_extable_entry_size(fromsec, &r, start, rel);
1832 check_section_mismatch(modname, elf, &r, sym, fromsec);
1837 * A module includes a number of sections that are discarded
1838 * either when loaded or when used as built-in.
1839 * For loaded modules all functions marked __init and all data
1840 * marked __initdata will be discarded when the module has been initialized.
1841 * Likewise for modules used built-in the sections marked __exit
1842 * are discarded because __exit marked function are supposed to be called
1843 * only when a module is unloaded which never happens for built-in modules.
1844 * The check_sec_ref() function traverses all relocation records
1845 * to find all references to a section that reference a section that will
1846 * be discarded and warns about it.
1848 static void check_sec_ref(struct module *mod, const char *modname,
1849 struct elf_info *elf)
1852 Elf_Shdr *sechdrs = elf->sechdrs;
1854 /* Walk through all sections */
1855 for (i = 0; i < elf->num_sections; i++) {
1856 check_section(modname, elf, &elf->sechdrs[i]);
1857 /* We want to process only relocation sections and not .init */
1858 if (sechdrs[i].sh_type == SHT_RELA)
1859 section_rela(modname, elf, &elf->sechdrs[i]);
1860 else if (sechdrs[i].sh_type == SHT_REL)
1861 section_rel(modname, elf, &elf->sechdrs[i]);
1865 static char *remove_dot(char *s)
1867 size_t n = strcspn(s, ".");
1870 size_t m = strspn(s + n + 1, "0123456789");
1871 if (m && (s[n + m] == '.' || s[n + m] == 0))
1877 static void read_symbols(char *modname)
1879 const char *symname;
1883 struct elf_info info = { };
1886 if (!parse_elf(&info, modname))
1889 mod = new_module(modname);
1891 /* When there's no vmlinux, don't print warnings about
1892 * unresolved symbols (since there'll be too many ;) */
1893 if (is_vmlinux(modname)) {
1898 license = get_modinfo(info.modinfo, info.modinfo_len, "license");
1899 if (info.modinfo && !license && !is_vmlinux(modname))
1900 warn("modpost: missing MODULE_LICENSE() in %s\n"
1901 "see include/linux/module.h for "
1902 "more information\n", modname);
1904 if (license_is_gpl_compatible(license))
1905 mod->gpl_compatible = 1;
1907 mod->gpl_compatible = 0;
1910 license = get_next_modinfo(info.modinfo, info.modinfo_len,
1911 "license", license);
1914 for (sym = info.symtab_start; sym < info.symtab_stop; sym++) {
1915 symname = remove_dot(info.strtab + sym->st_name);
1917 handle_modversions(mod, &info, sym, symname);
1918 handle_moddevtable(mod, &info, sym, symname);
1920 if (!is_vmlinux(modname) ||
1921 (is_vmlinux(modname) && vmlinux_section_warnings))
1922 check_sec_ref(mod, modname, &info);
1924 version = get_modinfo(info.modinfo, info.modinfo_len, "version");
1926 maybe_frob_rcs_version(modname, version, info.modinfo,
1927 version - (char *)info.hdr);
1928 if (version || (all_versions && !is_vmlinux(modname)))
1929 get_src_version(modname, mod->srcversion,
1930 sizeof(mod->srcversion)-1);
1932 parse_elf_finish(&info);
1934 /* Our trick to get versioning for module struct etc. - it's
1935 * never passed as an argument to an exported function, so
1936 * the automatic versioning doesn't pick it up, but it's really
1937 * important anyhow */
1939 mod->unres = alloc_symbol("module_layout", 0, mod->unres);
1942 static void read_symbols_from_files(const char *filename)
1945 char fname[PATH_MAX];
1947 if (strcmp(filename, "-") != 0) {
1948 in = fopen(filename, "r");
1950 fatal("Can't open filenames file %s: %m", filename);
1953 while (fgets(fname, PATH_MAX, in) != NULL) {
1954 if (strends(fname, "\n"))
1955 fname[strlen(fname)-1] = '\0';
1956 read_symbols(fname);
1965 /* We first write the generated file into memory using the
1966 * following helper, then compare to the file on disk and
1967 * only update the later if anything changed */
1969 void __attribute__((format(printf, 2, 3))) buf_printf(struct buffer *buf,
1970 const char *fmt, ...)
1977 len = vsnprintf(tmp, SZ, fmt, ap);
1978 buf_write(buf, tmp, len);
1982 void buf_write(struct buffer *buf, const char *s, int len)
1984 if (buf->size - buf->pos < len) {
1985 buf->size += len + SZ;
1986 buf->p = realloc(buf->p, buf->size);
1988 strncpy(buf->p + buf->pos, s, len);
1992 static void check_for_gpl_usage(enum export exp, const char *m, const char *s)
1994 const char *e = is_vmlinux(m) ?"":".ko";
1998 fatal("modpost: GPL-incompatible module %s%s "
1999 "uses GPL-only symbol '%s'\n", m, e, s);
2001 case export_unused_gpl:
2002 fatal("modpost: GPL-incompatible module %s%s "
2003 "uses GPL-only symbol marked UNUSED '%s'\n", m, e, s);
2005 case export_gpl_future:
2006 warn("modpost: GPL-incompatible module %s%s "
2007 "uses future GPL-only symbol '%s'\n", m, e, s);
2011 case export_unknown:
2017 static void check_for_unused(enum export exp, const char *m, const char *s)
2019 const char *e = is_vmlinux(m) ?"":".ko";
2023 case export_unused_gpl:
2024 warn("modpost: module %s%s "
2025 "uses symbol '%s' marked UNUSED\n", m, e, s);
2033 static void check_exports(struct module *mod)
2035 struct symbol *s, *exp;
2037 for (s = mod->unres; s; s = s->next) {
2038 const char *basename;
2039 exp = find_symbol(s->name);
2040 if (!exp || exp->module == mod)
2042 basename = strrchr(mod->name, '/');
2046 basename = mod->name;
2047 if (!mod->gpl_compatible)
2048 check_for_gpl_usage(exp->export, basename, exp->name);
2049 check_for_unused(exp->export, basename, exp->name);
2054 * Header for the generated file
2056 static void add_header(struct buffer *b, struct module *mod)
2058 buf_printf(b, "#include <linux/module.h>\n");
2059 buf_printf(b, "#include <linux/vermagic.h>\n");
2060 buf_printf(b, "#include <linux/compiler.h>\n");
2061 buf_printf(b, "\n");
2062 buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n");
2063 buf_printf(b, "\n");
2064 buf_printf(b, "__visible struct module __this_module\n");
2065 buf_printf(b, "__attribute__((section(\".gnu.linkonce.this_module\"))) = {\n");
2066 buf_printf(b, "\t.name = KBUILD_MODNAME,\n");
2068 buf_printf(b, "\t.init = init_module,\n");
2069 if (mod->has_cleanup)
2070 buf_printf(b, "#ifdef CONFIG_MODULE_UNLOAD\n"
2071 "\t.exit = cleanup_module,\n"
2073 buf_printf(b, "\t.arch = MODULE_ARCH_INIT,\n");
2074 buf_printf(b, "};\n");
2077 static void add_intree_flag(struct buffer *b, int is_intree)
2080 buf_printf(b, "\nMODULE_INFO(intree, \"Y\");\n");
2083 static void add_staging_flag(struct buffer *b, const char *name)
2085 static const char *staging_dir = "drivers/staging";
2087 if (strncmp(staging_dir, name, strlen(staging_dir)) == 0)
2088 buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n");
2092 * Record CRCs for unresolved symbols
2094 static int add_versions(struct buffer *b, struct module *mod)
2096 struct symbol *s, *exp;
2099 for (s = mod->unres; s; s = s->next) {
2100 exp = find_symbol(s->name);
2101 if (!exp || exp->module == mod) {
2102 if (have_vmlinux && !s->weak) {
2103 if (warn_unresolved) {
2104 warn("\"%s\" [%s.ko] undefined!\n",
2105 s->name, mod->name);
2107 merror("\"%s\" [%s.ko] undefined!\n",
2108 s->name, mod->name);
2114 s->module = exp->module;
2115 s->crc_valid = exp->crc_valid;
2122 buf_printf(b, "\n");
2123 buf_printf(b, "static const struct modversion_info ____versions[]\n");
2124 buf_printf(b, "__used\n");
2125 buf_printf(b, "__attribute__((section(\"__versions\"))) = {\n");
2127 for (s = mod->unres; s; s = s->next) {
2130 if (!s->crc_valid) {
2131 warn("\"%s\" [%s.ko] has no CRC!\n",
2132 s->name, mod->name);
2135 buf_printf(b, "\t{ %#8x, __VMLINUX_SYMBOL_STR(%s) },\n",
2139 buf_printf(b, "};\n");
2144 static void add_depends(struct buffer *b, struct module *mod,
2145 struct module *modules)
2151 for (m = modules; m; m = m->next)
2152 m->seen = is_vmlinux(m->name);
2154 buf_printf(b, "\n");
2155 buf_printf(b, "static const char __module_depends[]\n");
2156 buf_printf(b, "__used\n");
2157 buf_printf(b, "__attribute__((section(\".modinfo\"))) =\n");
2158 buf_printf(b, "\"depends=");
2159 for (s = mod->unres; s; s = s->next) {
2164 if (s->module->seen)
2167 s->module->seen = 1;
2168 p = strrchr(s->module->name, '/');
2172 p = s->module->name;
2173 buf_printf(b, "%s%s", first ? "" : ",", p);
2176 buf_printf(b, "\";\n");
2179 static void add_srcversion(struct buffer *b, struct module *mod)
2181 if (mod->srcversion[0]) {
2182 buf_printf(b, "\n");
2183 buf_printf(b, "MODULE_INFO(srcversion, \"%s\");\n",
2188 static void write_if_changed(struct buffer *b, const char *fname)
2194 file = fopen(fname, "r");
2198 if (fstat(fileno(file), &st) < 0)
2201 if (st.st_size != b->pos)
2204 tmp = NOFAIL(malloc(b->pos));
2205 if (fread(tmp, 1, b->pos, file) != b->pos)
2208 if (memcmp(tmp, b->p, b->pos) != 0)
2220 file = fopen(fname, "w");
2225 if (fwrite(b->p, 1, b->pos, file) != b->pos) {
2232 /* parse Module.symvers file. line format:
2233 * 0x12345678<tab>symbol<tab>module[[<tab>export]<tab>something]
2235 static void read_dump(const char *fname, unsigned int kernel)
2237 unsigned long size, pos = 0;
2238 void *file = grab_file(fname, &size);
2242 /* No symbol versions, silently ignore */
2245 while ((line = get_next_line(&pos, file, size))) {
2246 char *symname, *modname, *d, *export, *end;
2251 if (!(symname = strchr(line, '\t')))
2254 if (!(modname = strchr(symname, '\t')))
2257 if ((export = strchr(modname, '\t')) != NULL)
2259 if (export && ((end = strchr(export, '\t')) != NULL))
2261 crc = strtoul(line, &d, 16);
2262 if (*symname == '\0' || *modname == '\0' || *d != '\0')
2264 mod = find_module(modname);
2266 if (is_vmlinux(modname))
2268 mod = new_module(modname);
2271 s = sym_add_exported(symname, mod, export_no(export));
2274 sym_update_crc(symname, mod, crc, export_no(export));
2276 release_file(file, size);
2279 release_file(file, size);
2280 fatal("parse error in symbol dump file\n");
2283 /* For normal builds always dump all symbols.
2284 * For external modules only dump symbols
2285 * that are not read from kernel Module.symvers.
2287 static int dump_sym(struct symbol *sym)
2289 if (!external_module)
2291 if (sym->vmlinux || sym->kernel)
2296 static void write_dump(const char *fname)
2298 struct buffer buf = { };
2299 struct symbol *symbol;
2302 for (n = 0; n < SYMBOL_HASH_SIZE ; n++) {
2303 symbol = symbolhash[n];
2305 if (dump_sym(symbol))
2306 buf_printf(&buf, "0x%08x\t%s\t%s\t%s\n",
2307 symbol->crc, symbol->name,
2308 symbol->module->name,
2309 export_str(symbol->export));
2310 symbol = symbol->next;
2313 write_if_changed(&buf, fname);
2316 struct ext_sym_list {
2317 struct ext_sym_list *next;
2321 int main(int argc, char **argv)
2324 struct buffer buf = { };
2325 char *kernel_read = NULL, *module_read = NULL;
2326 char *dump_write = NULL, *files_source = NULL;
2329 struct ext_sym_list *extsym_iter;
2330 struct ext_sym_list *extsym_start = NULL;
2332 while ((opt = getopt(argc, argv, "i:I:e:mnsST:o:awM:K:")) != -1) {
2335 kernel_read = optarg;
2338 module_read = optarg;
2339 external_module = 1;
2342 external_module = 1;
2344 NOFAIL(malloc(sizeof(*extsym_iter)));
2345 extsym_iter->next = extsym_start;
2346 extsym_iter->file = optarg;
2347 extsym_start = extsym_iter;
2353 ignore_missing_files = 1;
2356 dump_write = optarg;
2362 vmlinux_section_warnings = 0;
2365 sec_mismatch_verbose = 0;
2368 files_source = optarg;
2371 warn_unresolved = 1;
2379 read_dump(kernel_read, 1);
2381 read_dump(module_read, 0);
2382 while (extsym_start) {
2383 read_dump(extsym_start->file, 0);
2384 extsym_iter = extsym_start->next;
2386 extsym_start = extsym_iter;
2389 while (optind < argc)
2390 read_symbols(argv[optind++]);
2393 read_symbols_from_files(files_source);
2395 for (mod = modules; mod; mod = mod->next) {
2403 for (mod = modules; mod; mod = mod->next) {
2404 char fname[PATH_MAX];
2411 add_header(&buf, mod);
2412 add_intree_flag(&buf, !external_module);
2413 add_staging_flag(&buf, mod->name);
2414 err |= add_versions(&buf, mod);
2415 add_depends(&buf, mod, modules);
2416 add_moddevtable(&buf, mod);
2417 add_srcversion(&buf, mod);
2419 sprintf(fname, "%s.mod.c", mod->name);
2420 write_if_changed(&buf, fname);
2424 write_dump(dump_write);
2425 if (sec_mismatch_count && !sec_mismatch_verbose)
2426 warn("modpost: Found %d section mismatch(es).\n"
2427 "To see full details build your kernel with:\n"
2428 "'make CONFIG_DEBUG_SECTION_MISMATCH=y'\n",
2429 sec_mismatch_count);