Linux 3.16.75
[linux/fpc-iii.git] / scripts / mod / modpost.c
blobf86b4f77cd76f94c635b33f9d1027732f5f99e24
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 ...
14 #define _GNU_SOURCE
15 #include <stdio.h>
16 #include <ctype.h>
17 #include <string.h>
18 #include <limits.h>
19 #include <stdbool.h>
20 #include <errno.h>
21 #include "modpost.h"
22 #include "../../include/generated/autoconf.h"
23 #include "../../include/linux/license.h"
24 #include "../../include/linux/export.h"
26 /* Are we using CONFIG_MODVERSIONS? */
27 int modversions = 0;
28 /* Warn about undefined symbols? (do so if we have vmlinux) */
29 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;
44 enum export {
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, ...)
53 va_list arglist;
55 fprintf(stderr, "FATAL: ");
57 va_start(arglist, fmt);
58 vfprintf(stderr, fmt, arglist);
59 va_end(arglist);
61 exit(1);
64 PRINTF void warn(const char *fmt, ...)
66 va_list arglist;
68 fprintf(stderr, "WARNING: ");
70 va_start(arglist, fmt);
71 vfprintf(stderr, fmt, arglist);
72 va_end(arglist);
75 PRINTF void merror(const char *fmt, ...)
77 va_list arglist;
79 fprintf(stderr, "ERROR: ");
81 va_start(arglist, fmt);
82 vfprintf(stderr, fmt, arglist);
83 va_end(arglist);
86 static inline bool strends(const char *str, const char *postfix)
88 if (strlen(str) < strlen(postfix))
89 return false;
91 return strcmp(str + strlen(str) - strlen(postfix), postfix) == 0;
94 static int is_vmlinux(const char *modname)
96 const char *myname;
98 myname = strrchr(modname, '/');
99 if (myname)
100 myname++;
101 else
102 myname = modname;
104 return (strcmp(myname, "vmlinux") == 0) ||
105 (strcmp(myname, "vmlinux.o") == 0);
108 void *do_nofail(void *ptr, const char *expr)
110 if (!ptr)
111 fatal("modpost: Memory allocation failure: %s.\n", expr);
113 return ptr;
116 /* A list of all modules we processed */
117 static struct module *modules;
119 static struct module *find_module(char *modname)
121 struct module *mod;
123 for (mod = modules; mod; mod = mod->next)
124 if (strcmp(mod->name, modname) == 0)
125 break;
126 return mod;
129 static struct module *new_module(const char *modname)
131 struct module *mod;
132 char *p;
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';
141 mod->is_dot_o = 1;
144 /* add to list */
145 mod->name = p;
146 mod->gpl_compatible = -1;
147 mod->next = modules;
148 modules = mod;
150 return mod;
153 /* A hash of all exported symbols,
154 * struct symbol is also used for lists of unresolved symbols */
156 #define SYMBOL_HASH_SIZE 1024
158 struct symbol {
159 struct symbol *next;
160 struct module *module;
161 unsigned int crc;
162 int crc_valid;
163 unsigned int weak:1;
164 unsigned int vmlinux:1; /* 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 */
169 char name[0];
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,
192 struct symbol *next)
194 struct symbol *s = NOFAIL(malloc(sizeof(*s) + strlen(name) + 1));
196 memset(s, 0, sizeof(*s));
197 strcpy(s->name, name);
198 s->weak = weak;
199 s->next = next;
200 return s;
203 /* For the hash of exported symbols */
204 static struct symbol *new_symbol(const char *name, struct module *module,
205 enum export export)
207 unsigned int hash;
208 struct symbol *new;
210 hash = tdb_hash(name) % SYMBOL_HASH_SIZE;
211 new = symbolhash[hash] = alloc_symbol(name, 0, symbolhash[hash]);
212 new->module = module;
213 new->export = export;
214 return new;
217 static struct symbol *find_symbol(const char *name)
219 struct symbol *s;
221 /* For our purposes, .foo matches foo. PPC64 needs this. */
222 if (name[0] == '.')
223 name++;
225 for (s = symbolhash[tdb_hash(name) % SYMBOL_HASH_SIZE]; s; s = s->next) {
226 if (strcmp(s->name, name) == 0)
227 return s;
229 return NULL;
232 static struct {
233 const char *str;
234 enum export export;
235 } export_list[] = {
236 { .str = "EXPORT_SYMBOL", .export = export_plain },
237 { .str = "EXPORT_UNUSED_SYMBOL", .export = export_unused },
238 { .str = "EXPORT_SYMBOL_GPL", .export = export_gpl },
239 { .str = "EXPORT_UNUSED_SYMBOL_GPL", .export = export_unused_gpl },
240 { .str = "EXPORT_SYMBOL_GPL_FUTURE", .export = export_gpl_future },
241 { .str = "(unknown)", .export = export_unknown },
245 static const char *export_str(enum export ex)
247 return export_list[ex].str;
250 static enum export export_no(const char *s)
252 int i;
254 if (!s)
255 return export_unknown;
256 for (i = 0; export_list[i].export != export_unknown; i++) {
257 if (strcmp(export_list[i].str, s) == 0)
258 return export_list[i].export;
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+"))
272 return export_plain;
273 else if (strstarts(secname, "___ksymtab_unused+"))
274 return export_unused;
275 else if (strstarts(secname, "___ksymtab_gpl+"))
276 return export_gpl;
277 else if (strstarts(secname, "___ksymtab_unused_gpl+"))
278 return export_unused_gpl;
279 else if (strstarts(secname, "___ksymtab_gpl_future+"))
280 return export_gpl_future;
281 else
282 return export_unknown;
285 static enum export export_from_sec(struct elf_info *elf, unsigned int sec)
287 if (sec == elf->export_sec)
288 return export_plain;
289 else if (sec == elf->export_unused_sec)
290 return export_unused;
291 else if (sec == elf->export_gpl_sec)
292 return export_gpl;
293 else if (sec == elf->export_unused_gpl_sec)
294 return export_unused_gpl;
295 else if (sec == elf->export_gpl_future_sec)
296 return export_gpl_future;
297 else
298 return export_unknown;
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,
306 enum export export)
308 struct symbol *s = find_symbol(name);
310 if (!s) {
311 s = new_symbol(name, mod, export);
312 } else {
313 if (!s->preloaded) {
314 warn("%s: '%s' exported twice. Previous export "
315 "was in %s%s\n", mod->name, name,
316 s->module->name,
317 is_vmlinux(s->module->name) ?"":".ko");
318 } else {
319 /* In case Module.symvers was out of date */
320 s->module = mod;
323 s->preloaded = 0;
324 s->vmlinux = is_vmlinux(mod->name);
325 s->kernel = 0;
326 s->export = export;
327 return s;
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);
335 if (!s) {
336 s = new_symbol(name, mod, export);
337 /* Don't complain when we find it later. */
338 s->preloaded = 1;
340 s->crc = crc;
341 s->crc_valid = 1;
344 void *grab_file(const char *filename, unsigned long *size)
346 struct stat st;
347 void *map = MAP_FAILED;
348 int fd;
350 fd = open(filename, O_RDONLY);
351 if (fd < 0)
352 return NULL;
353 if (fstat(fd, &st))
354 goto failed;
356 *size = st.st_size;
357 map = mmap(NULL, *size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
359 failed:
360 close(fd);
361 if (map == MAP_FAILED)
362 return NULL;
363 return map;
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];
374 int skip = 1;
375 size_t len = 0;
376 signed char *p = (signed char *)file + *pos;
377 char *s = line;
379 for (; *pos < size ; (*pos)++) {
380 if (skip && isspace(*p)) {
381 p++;
382 continue;
384 skip = 0;
385 if (*p != '\n' && (*pos < size)) {
386 len++;
387 *s++ = *p++;
388 if (len > 4095)
389 break; /* Too long, stop */
390 } else {
391 /* End of string */
392 *s = '\0';
393 return line;
396 /* End of buffer */
397 return NULL;
400 void release_file(void *file, unsigned long size)
402 munmap(file, size);
405 static int parse_elf(struct elf_info *info, const char *filename)
407 unsigned int i;
408 Elf_Ehdr *hdr;
409 Elf_Shdr *sechdrs;
410 Elf_Sym *sym;
411 const char *secstrings;
412 unsigned int symtab_idx = ~0U, symtab_shndx_idx = ~0U;
414 hdr = grab_file(filename, &info->size);
415 if (!hdr) {
416 if (ignore_missing_files) {
417 fprintf(stderr, "%s: %s (ignored)\n", filename,
418 strerror(errno));
419 return 0;
421 perror(filename);
422 exit(1);
424 info->hdr = hdr;
425 if (info->size < sizeof(*hdr)) {
426 /* file too small, assume this is an empty .o file */
427 return 0;
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 */
435 return 0;
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);
459 return 0;
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);
469 else {
470 info->num_sections = hdr->e_shnum;
472 if (hdr->e_shstrndx == SHN_XINDEX) {
473 info->secindex_strings = TO_NATIVE(sechdrs[0].sh_link);
475 else {
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++) {
495 const char *secname;
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,
502 sizeof(*hdr));
503 return 0;
505 secname = secstrings + sechdrs[i].sh_name;
506 if (strcmp(secname, ".modinfo") == 0) {
507 if (nobits)
508 fatal("%s has NOBITS .modinfo\n", filename);
509 info->modinfo = (void *)hdr + sechdrs[i].sh_offset;
510 info->modinfo_len = sechdrs[i].sh_size;
511 } else if (strcmp(secname, "__ksymtab") == 0)
512 info->export_sec = i;
513 else if (strcmp(secname, "__ksymtab_unused") == 0)
514 info->export_unused_sec = i;
515 else if (strcmp(secname, "__ksymtab_gpl") == 0)
516 info->export_gpl_sec = i;
517 else if (strcmp(secname, "__ksymtab_unused_gpl") == 0)
518 info->export_unused_gpl_sec = i;
519 else if (strcmp(secname, "__ksymtab_gpl_future") == 0)
520 info->export_gpl_future_sec = i;
522 if (sechdrs[i].sh_type == SHT_SYMTAB) {
523 unsigned int sh_link_idx;
524 symtab_idx = i;
525 info->symtab_start = (void *)hdr +
526 sechdrs[i].sh_offset;
527 info->symtab_stop = (void *)hdr +
528 sechdrs[i].sh_offset + sechdrs[i].sh_size;
529 sh_link_idx = sechdrs[i].sh_link;
530 info->strtab = (void *)hdr +
531 sechdrs[sh_link_idx].sh_offset;
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) {
555 Elf32_Word *p;
556 if (symtab_idx != sechdrs[symtab_shndx_idx].sh_link)
557 fatal("%s: SYMTAB_SHNDX has bad sh_link: %u!=%u\n",
558 filename, sechdrs[symtab_shndx_idx].sh_link,
559 symtab_idx);
560 /* Fix endianness */
561 for (p = info->symtab_shndx_start; p < info->symtab_shndx_stop;
562 p++)
563 *p = TO_NATIVE(*p);
566 return 1;
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)
578 return 1;
579 /* ignore global offset table */
580 if (strcmp(symname, "_GLOBAL_OFFSET_TABLE_") == 0)
581 return 1;
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)
590 return 1;
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)
597 return 1;
598 /* Do not ignore this symbol */
599 return 0;
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)
608 unsigned int crc;
609 enum export export;
611 if ((!is_vmlinux(mod->name) || mod->is_dot_o) &&
612 strncmp(symname, "__ksymtab", 9) == 0)
613 export = export_from_secname(info, get_secindex(info, sym));
614 else
615 export = export_from_sec(info, get_secindex(info, sym));
617 /* CRC'd symbol */
618 if (strncmp(symname, CRC_PFX, strlen(CRC_PFX)) == 0) {
619 crc = (unsigned int) sym->st_value;
620 sym_update_crc(symname + strlen(CRC_PFX), mod, crc,
621 export);
624 switch (sym->st_shndx) {
625 case SHN_COMMON:
626 if (!strncmp(symname, "__gnu_lto_", sizeof("__gnu_lto_")-1)) {
627 /* Should warn here, but modpost runs before the linker */
628 } else
629 warn("\"%s\" [%s] is COMMON symbol\n", symname, mod->name);
630 break;
631 case SHN_UNDEF:
632 /* undefined symbol */
633 if (ELF_ST_BIND(sym->st_info) != STB_GLOBAL &&
634 ELF_ST_BIND(sym->st_info) != STB_WEAK)
635 break;
636 if (ignore_undef_symbol(info, symname))
637 break;
638 /* 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
643 #endif
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)
648 break;
649 if (symname[0] == '.') {
650 char *munged = strdup(symname);
651 munged[0] = '_';
652 munged[1] = toupper(munged[1]);
653 symname = munged;
656 #endif
658 #ifdef CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX
659 if (symname[0] != '_')
660 break;
661 else
662 symname++;
663 #endif
664 mod->unres = alloc_symbol(symname,
665 ELF_ST_BIND(sym->st_info) == STB_WEAK,
666 mod->unres);
667 break;
668 default:
669 /* All exported symbols */
670 if (strncmp(symname, KSYMTAB_PFX, strlen(KSYMTAB_PFX)) == 0) {
671 sym_add_exported(symname + strlen(KSYMTAB_PFX), mod,
672 export);
674 if (strcmp(symname, VMLINUX_SYMBOL_STR(init_module)) == 0)
675 mod->has_init = 1;
676 if (strcmp(symname, VMLINUX_SYMBOL_STR(cleanup_module)) == 0)
677 mod->has_cleanup = 1;
678 break;
683 * Parse tag=value strings from .modinfo section
685 static char *next_string(char *string, unsigned long *secsize)
687 /* Skip non-zero chars */
688 while (string[0]) {
689 string++;
690 if ((*secsize)-- <= 1)
691 return NULL;
694 /* Skip any zero padding. */
695 while (!string[0]) {
696 string++;
697 if ((*secsize)-- <= 1)
698 return NULL;
700 return string;
703 static char *get_next_modinfo(void *modinfo, unsigned long modinfo_len,
704 const char *tag, char *info)
706 char *p;
707 unsigned int taglen = strlen(tag);
708 unsigned long size = modinfo_len;
710 if (info) {
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;
719 return NULL;
722 static char *get_modinfo(void *modinfo, unsigned long modinfo_len,
723 const char *tag)
726 return get_next_modinfo(modinfo, modinfo_len, tag, NULL);
730 * Test if string s ends in string sub
731 * return 0 if match
733 static int strrcmp(const char *s, const char *sub)
735 int slen, sublen;
737 if (!s || !sub)
738 return 1;
740 slen = strlen(s);
741 sublen = strlen(sub);
743 if ((slen == 0) || (sublen == 0))
744 return 1;
746 if (sublen > slen)
747 return 1;
749 return memcmp(s + slen - sublen, sub, sublen);
752 static const char *sym_name(struct elf_info *elf, Elf_Sym *sym)
754 if (sym)
755 return elf->strtab + sym->st_name;
756 else
757 return "(unknown)";
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 +
772 sechdr->sh_name;
775 /* if sym is empty or point to a string
776 * like ".[0-9]+" then return 1.
777 * This is the optional prefix added by ld to some sections
779 static int number_prefix(const char *sym)
781 if (*sym++ == '\0')
782 return 1;
783 if (*sym != '.')
784 return 0;
785 do {
786 char c = *sym++;
787 if (c < '0' || c > '9')
788 return 0;
789 } while (*sym);
790 return 1;
793 /* The pattern is an array of simple patterns.
794 * "foo" will match an exact string equal to "foo"
795 * "*foo" will match a string that ends with "foo"
796 * "foo*" will match a string that begins with "foo"
797 * "foo$" will match a string equal to "foo" or "foo.1"
798 * where the '1' can be any number including several digits.
799 * The $ syntax is for sections where ld append a dot number
800 * to make section name unique.
801 * "*foo*" will match a string that contains "foo"
803 static int match(const char *sym, const char * const pat[])
805 const char *p;
806 while (*pat) {
807 p = *pat++;
808 const char *endp = p + strlen(p) - 1;
810 /* "*foo*" */
811 if (*p == '*' && *endp == '*') {
812 char *here, *bare = strndup(p + 1, strlen(p) - 2);
814 here = strstr(sym, bare);
815 free(bare);
816 if (here != NULL)
817 return 1;
819 /* "*foo" */
820 else if (*p == '*') {
821 if (strrcmp(sym, p + 1) == 0)
822 return 1;
824 /* "foo*" */
825 else if (*endp == '*') {
826 if (strncmp(sym, p, strlen(p) - 1) == 0)
827 return 1;
829 /* "foo$" */
830 else if (*endp == '$') {
831 if (strncmp(sym, p, strlen(p) - 1) == 0) {
832 if (number_prefix(sym + strlen(p) - 1))
833 return 1;
836 /* no wildcards */
837 else {
838 if (strcmp(p, sym) == 0)
839 return 1;
842 /* no match */
843 return 0;
846 /* sections that we do not want to do full section mismatch check on */
847 static const char *section_white_list[] =
849 ".comment*",
850 ".debug*",
851 ".cranges", /* sh64 */
852 ".zdebug*", /* Compressed debug sections. */
853 ".GCC-command-line", /* mn10300 */
854 ".GCC.command.line", /* record-gcc-switches, non mn10300 */
855 ".mdebug*", /* alpha, score, mips etc. */
856 ".pdr", /* alpha, score, mips etc. */
857 ".stab*",
858 ".note*",
859 ".got*",
860 ".toc*",
861 ".xt.prop", /* xtensa */
862 ".xt.lit", /* xtensa */
863 ".arcextmap*", /* arc */
864 ".gnu.linkonce.arcext*", /* arc : modules */
865 ".gnu.lto*",
866 NULL
870 * This is used to find sections missing the SHF_ALLOC flag.
871 * The cause of this is often a section specified in assembler
872 * without "ax" / "aw".
874 static void check_section(const char *modname, struct elf_info *elf,
875 Elf_Shdr *sechdr)
877 const char *sec = sech_name(elf, sechdr);
879 if (sechdr->sh_type == SHT_PROGBITS &&
880 !(sechdr->sh_flags & SHF_ALLOC) &&
881 !match(sec, section_white_list)) {
882 warn("%s (%s): unexpected non-allocatable section.\n"
883 "Did you forget to use \"ax\"/\"aw\" in a .S file?\n"
884 "Note that for example <linux/init.h> contains\n"
885 "section definitions for use in .S files.\n\n",
886 modname, sec);
892 #define ALL_INIT_DATA_SECTIONS \
893 ".init.setup$", ".init.rodata$", ".meminit.rodata$", \
894 ".init.data$", ".meminit.data$"
895 #define ALL_EXIT_DATA_SECTIONS \
896 ".exit.data$", ".memexit.data$"
898 #define ALL_INIT_TEXT_SECTIONS \
899 ".init.text$", ".meminit.text$"
900 #define ALL_EXIT_TEXT_SECTIONS \
901 ".exit.text$", ".memexit.text$"
903 #define ALL_PCI_INIT_SECTIONS \
904 ".pci_fixup_early$", ".pci_fixup_header$", ".pci_fixup_final$", \
905 ".pci_fixup_enable$", ".pci_fixup_resume$", \
906 ".pci_fixup_resume_early$", ".pci_fixup_suspend$"
908 #define ALL_XXXINIT_SECTIONS MEM_INIT_SECTIONS
909 #define ALL_XXXEXIT_SECTIONS MEM_EXIT_SECTIONS
911 #define ALL_INIT_SECTIONS INIT_SECTIONS, ALL_XXXINIT_SECTIONS
912 #define ALL_EXIT_SECTIONS EXIT_SECTIONS, ALL_XXXEXIT_SECTIONS
914 #define DATA_SECTIONS ".data$", ".data.rel$"
915 #define TEXT_SECTIONS ".text$", ".text.unlikely$"
917 #define INIT_SECTIONS ".init.*"
918 #define MEM_INIT_SECTIONS ".meminit.*"
920 #define EXIT_SECTIONS ".exit.*"
921 #define MEM_EXIT_SECTIONS ".memexit.*"
923 /* init data sections */
924 static const char *init_data_sections[] = { ALL_INIT_DATA_SECTIONS, NULL };
926 /* all init sections */
927 static const char *init_sections[] = { ALL_INIT_SECTIONS, NULL };
929 /* All init and exit sections (code + data) */
930 static const char *init_exit_sections[] =
931 {ALL_INIT_SECTIONS, ALL_EXIT_SECTIONS, NULL };
933 /* all text sections */
934 static const char *const text_sections[] = { ALL_INIT_TEXT_SECTIONS,
935 ALL_EXIT_TEXT_SECTIONS, TEXT_SECTIONS, NULL };
937 /* data section */
938 static const char *data_sections[] = { DATA_SECTIONS, NULL };
941 /* symbols in .data that may refer to init/exit sections */
942 #define DEFAULT_SYMBOL_WHITE_LIST \
943 "*driver", \
944 "*_template", /* scsi uses *_template a lot */ \
945 "*_timer", /* arm uses ops structures named _timer a lot */ \
946 "*_sht", /* scsi also used *_sht to some extent */ \
947 "*_ops", \
948 "*_probe", \
949 "*_probe_one", \
950 "*_console"
952 static const char *head_sections[] = { ".head.text*", NULL };
953 static const char *linker_symbols[] =
954 { "__init_begin", "_sinittext", "_einittext", NULL };
955 static const char *const optim_symbols[] = { "*.constprop.*", NULL };
957 enum mismatch {
958 TEXT_TO_ANY_INIT,
959 DATA_TO_ANY_INIT,
960 TEXT_TO_ANY_EXIT,
961 DATA_TO_ANY_EXIT,
962 XXXINIT_TO_SOME_INIT,
963 XXXEXIT_TO_SOME_EXIT,
964 ANY_INIT_TO_ANY_EXIT,
965 ANY_EXIT_TO_ANY_INIT,
966 EXPORT_TO_INIT_EXIT,
969 struct sectioncheck {
970 const char *fromsec[20];
971 const char *tosec[20];
972 enum mismatch mismatch;
973 const char *symbol_white_list[20];
976 const struct sectioncheck sectioncheck[] = {
977 /* Do not reference init/exit code/data from
978 * normal code and data
981 .fromsec = { TEXT_SECTIONS, NULL },
982 .tosec = { ALL_INIT_SECTIONS, NULL },
983 .mismatch = TEXT_TO_ANY_INIT,
984 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
987 .fromsec = { DATA_SECTIONS, NULL },
988 .tosec = { ALL_XXXINIT_SECTIONS, NULL },
989 .mismatch = DATA_TO_ANY_INIT,
990 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
993 .fromsec = { DATA_SECTIONS, NULL },
994 .tosec = { INIT_SECTIONS, NULL },
995 .mismatch = DATA_TO_ANY_INIT,
996 .symbol_white_list = {
997 "*_template", "*_timer", "*_sht", "*_ops",
998 "*_probe", "*_probe_one", "*_console", NULL
1002 .fromsec = { TEXT_SECTIONS, NULL },
1003 .tosec = { ALL_EXIT_SECTIONS, NULL },
1004 .mismatch = TEXT_TO_ANY_EXIT,
1005 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1008 .fromsec = { DATA_SECTIONS, NULL },
1009 .tosec = { ALL_EXIT_SECTIONS, NULL },
1010 .mismatch = DATA_TO_ANY_EXIT,
1011 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1013 /* Do not reference init code/data from meminit code/data */
1015 .fromsec = { ALL_XXXINIT_SECTIONS, NULL },
1016 .tosec = { INIT_SECTIONS, NULL },
1017 .mismatch = XXXINIT_TO_SOME_INIT,
1018 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1020 /* Do not reference exit code/data from memexit code/data */
1022 .fromsec = { ALL_XXXEXIT_SECTIONS, NULL },
1023 .tosec = { EXIT_SECTIONS, NULL },
1024 .mismatch = XXXEXIT_TO_SOME_EXIT,
1025 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1027 /* Do not use exit code/data from init code */
1029 .fromsec = { ALL_INIT_SECTIONS, NULL },
1030 .tosec = { ALL_EXIT_SECTIONS, NULL },
1031 .mismatch = ANY_INIT_TO_ANY_EXIT,
1032 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1034 /* Do not use init code/data from exit code */
1036 .fromsec = { ALL_EXIT_SECTIONS, NULL },
1037 .tosec = { ALL_INIT_SECTIONS, NULL },
1038 .mismatch = ANY_EXIT_TO_ANY_INIT,
1039 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1042 .fromsec = { ALL_PCI_INIT_SECTIONS, NULL },
1043 .tosec = { INIT_SECTIONS, NULL },
1044 .mismatch = ANY_INIT_TO_ANY_EXIT,
1045 .symbol_white_list = { NULL },
1047 /* Do not export init/exit functions or data */
1049 .fromsec = { "__ksymtab*", NULL },
1050 .tosec = { INIT_SECTIONS, EXIT_SECTIONS, NULL },
1051 .mismatch = EXPORT_TO_INIT_EXIT,
1052 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1056 static const struct sectioncheck *section_mismatch(
1057 const char *fromsec, const char *tosec)
1059 int i;
1060 int elems = sizeof(sectioncheck) / sizeof(struct sectioncheck);
1061 const struct sectioncheck *check = &sectioncheck[0];
1063 for (i = 0; i < elems; i++) {
1064 if (match(fromsec, check->fromsec) &&
1065 match(tosec, check->tosec))
1066 return check;
1067 check++;
1069 return NULL;
1073 * Whitelist to allow certain references to pass with no warning.
1075 * Pattern 1:
1076 * If a module parameter is declared __initdata and permissions=0
1077 * then this is legal despite the warning generated.
1078 * We cannot see value of permissions here, so just ignore
1079 * this pattern.
1080 * The pattern is identified by:
1081 * tosec = .init.data
1082 * fromsec = .data*
1083 * atsym =__param*
1085 * Pattern 1a:
1086 * module_param_call() ops can refer to __init set function if permissions=0
1087 * The pattern is identified by:
1088 * tosec = .init.text
1089 * fromsec = .data*
1090 * atsym = __param_ops_*
1092 * Pattern 2:
1093 * Many drivers utilise a *driver container with references to
1094 * add, remove, probe functions etc.
1095 * the pattern is identified by:
1096 * tosec = init or exit section
1097 * fromsec = data section
1098 * atsym = *driver, *_template, *_sht, *_ops, *_probe,
1099 * *probe_one, *_console, *_timer
1101 * Pattern 3:
1102 * Whitelist all references from .head.text to any init section
1104 * Pattern 4:
1105 * Some symbols belong to init section but still it is ok to reference
1106 * these from non-init sections as these symbols don't have any memory
1107 * allocated for them and symbol address and value are same. So even
1108 * if init section is freed, its ok to reference those symbols.
1109 * For ex. symbols marking the init section boundaries.
1110 * This pattern is identified by
1111 * refsymname = __init_begin, _sinittext, _einittext
1113 * Pattern 5:
1114 * GCC may optimize static inlines when fed constant arg(s) resulting
1115 * in functions like cpumask_empty() -- generating an associated symbol
1116 * cpumask_empty.constprop.3 that appears in the audit. If the const that
1117 * is passed in comes from __init, like say nmi_ipi_mask, we get a
1118 * meaningless section warning. May need to add isra symbols too...
1119 * This pattern is identified by
1120 * tosec = init section
1121 * fromsec = text section
1122 * refsymname = *.constprop.*
1125 static int secref_whitelist(const struct sectioncheck *mismatch,
1126 const char *fromsec, const char *fromsym,
1127 const char *tosec, const char *tosym)
1129 /* Check for pattern 1 */
1130 if (match(tosec, init_data_sections) &&
1131 match(fromsec, data_sections) &&
1132 (strncmp(fromsym, "__param", strlen("__param")) == 0))
1133 return 0;
1135 /* Check for pattern 1a */
1136 if (strcmp(tosec, ".init.text") == 0 &&
1137 match(fromsec, data_sections) &&
1138 (strncmp(fromsym, "__param_ops_", strlen("__param_ops_")) == 0))
1139 return 0;
1141 /* Check for pattern 2 */
1142 if (match(tosec, init_exit_sections) &&
1143 match(fromsec, data_sections) &&
1144 match(fromsym, mismatch->symbol_white_list))
1145 return 0;
1147 /* Check for pattern 3 */
1148 if (match(fromsec, head_sections) &&
1149 match(tosec, init_sections))
1150 return 0;
1152 /* Check for pattern 4 */
1153 if (match(tosym, linker_symbols))
1154 return 0;
1156 /* Check for pattern 5 */
1157 if (match(fromsec, text_sections) &&
1158 match(tosec, init_sections) &&
1159 match(fromsym, optim_symbols))
1160 return 0;
1162 return 1;
1166 * Find symbol based on relocation record info.
1167 * In some cases the symbol supplied is a valid symbol so
1168 * return refsym. If st_name != 0 we assume this is a valid symbol.
1169 * In other cases the symbol needs to be looked up in the symbol table
1170 * based on section and address.
1171 * **/
1172 static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr,
1173 Elf_Sym *relsym)
1175 Elf_Sym *sym;
1176 Elf_Sym *near = NULL;
1177 Elf64_Sword distance = 20;
1178 Elf64_Sword d;
1179 unsigned int relsym_secindex;
1181 if (relsym->st_name != 0)
1182 return relsym;
1184 relsym_secindex = get_secindex(elf, relsym);
1185 for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
1186 if (get_secindex(elf, sym) != relsym_secindex)
1187 continue;
1188 if (ELF_ST_TYPE(sym->st_info) == STT_SECTION)
1189 continue;
1190 if (sym->st_value == addr)
1191 return sym;
1192 /* Find a symbol nearby - addr are maybe negative */
1193 d = sym->st_value - addr;
1194 if (d < 0)
1195 d = addr - sym->st_value;
1196 if (d < distance) {
1197 distance = d;
1198 near = sym;
1201 /* We need a close match */
1202 if (distance < 20)
1203 return near;
1204 else
1205 return NULL;
1208 static inline int is_arm_mapping_symbol(const char *str)
1210 return str[0] == '$' && strchr("atd", str[1])
1211 && (str[2] == '\0' || str[2] == '.');
1215 * If there's no name there, ignore it; likewise, ignore it if it's
1216 * one of the magic symbols emitted used by current ARM tools.
1218 * Otherwise if find_symbols_between() returns those symbols, they'll
1219 * fail the whitelist tests and cause lots of false alarms ... fixable
1220 * only by merging __exit and __init sections into __text, bloating
1221 * the kernel (which is especially evil on embedded platforms).
1223 static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym)
1225 const char *name = elf->strtab + sym->st_name;
1227 if (!name || !strlen(name))
1228 return 0;
1229 return !is_arm_mapping_symbol(name);
1233 * Find symbols before or equal addr and after addr - in the section sec.
1234 * If we find two symbols with equal offset prefer one with a valid name.
1235 * The ELF format may have a better way to detect what type of symbol
1236 * it is, but this works for now.
1238 static Elf_Sym *find_elf_symbol2(struct elf_info *elf, Elf_Addr addr,
1239 const char *sec)
1241 Elf_Sym *sym;
1242 Elf_Sym *near = NULL;
1243 Elf_Addr distance = ~0;
1245 for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
1246 const char *symsec;
1248 if (is_shndx_special(sym->st_shndx))
1249 continue;
1250 symsec = sec_name(elf, get_secindex(elf, sym));
1251 if (strcmp(symsec, sec) != 0)
1252 continue;
1253 if (!is_valid_name(elf, sym))
1254 continue;
1255 if (sym->st_value <= addr) {
1256 if ((addr - sym->st_value) < distance) {
1257 distance = addr - sym->st_value;
1258 near = sym;
1259 } else if ((addr - sym->st_value) == distance) {
1260 near = sym;
1264 return near;
1268 * Convert a section name to the function/data attribute
1269 * .init.text => __init
1270 * .memexitconst => __memconst
1271 * etc.
1273 * The memory of returned value has been allocated on a heap. The user of this
1274 * method should free it after usage.
1276 static char *sec2annotation(const char *s)
1278 if (match(s, init_exit_sections)) {
1279 char *p = malloc(20);
1280 char *r = p;
1282 *p++ = '_';
1283 *p++ = '_';
1284 if (*s == '.')
1285 s++;
1286 while (*s && *s != '.')
1287 *p++ = *s++;
1288 *p = '\0';
1289 if (*s == '.')
1290 s++;
1291 if (strstr(s, "rodata") != NULL)
1292 strcat(p, "const ");
1293 else if (strstr(s, "data") != NULL)
1294 strcat(p, "data ");
1295 else
1296 strcat(p, " ");
1297 return r;
1298 } else {
1299 return strdup("");
1303 static int is_function(Elf_Sym *sym)
1305 if (sym)
1306 return ELF_ST_TYPE(sym->st_info) == STT_FUNC;
1307 else
1308 return -1;
1311 static void print_section_list(const char * const list[20])
1313 const char *const *s = list;
1315 while (*s) {
1316 fprintf(stderr, "%s", *s);
1317 s++;
1318 if (*s)
1319 fprintf(stderr, ", ");
1321 fprintf(stderr, "\n");
1325 * Print a warning about a section mismatch.
1326 * Try to find symbols near it so user can find it.
1327 * Check whitelist before warning - it may be a false positive.
1329 static void report_sec_mismatch(const char *modname,
1330 const struct sectioncheck *mismatch,
1331 const char *fromsec,
1332 unsigned long long fromaddr,
1333 const char *fromsym,
1334 int from_is_func,
1335 const char *tosec, const char *tosym,
1336 int to_is_func)
1338 const char *from, *from_p;
1339 const char *to, *to_p;
1340 char *prl_from;
1341 char *prl_to;
1343 switch (from_is_func) {
1344 case 0: from = "variable"; from_p = ""; break;
1345 case 1: from = "function"; from_p = "()"; break;
1346 default: from = "(unknown reference)"; from_p = ""; break;
1348 switch (to_is_func) {
1349 case 0: to = "variable"; to_p = ""; break;
1350 case 1: to = "function"; to_p = "()"; break;
1351 default: to = "(unknown reference)"; to_p = ""; break;
1354 sec_mismatch_count++;
1355 if (!sec_mismatch_verbose)
1356 return;
1358 warn("%s(%s+0x%llx): Section mismatch in reference from the %s %s%s "
1359 "to the %s %s:%s%s\n",
1360 modname, fromsec, fromaddr, from, fromsym, from_p, to, tosec,
1361 tosym, to_p);
1363 switch (mismatch->mismatch) {
1364 case TEXT_TO_ANY_INIT:
1365 prl_from = sec2annotation(fromsec);
1366 prl_to = sec2annotation(tosec);
1367 fprintf(stderr,
1368 "The function %s%s() references\n"
1369 "the %s %s%s%s.\n"
1370 "This is often because %s lacks a %s\n"
1371 "annotation or the annotation of %s is wrong.\n",
1372 prl_from, fromsym,
1373 to, prl_to, tosym, to_p,
1374 fromsym, prl_to, tosym);
1375 free(prl_from);
1376 free(prl_to);
1377 break;
1378 case DATA_TO_ANY_INIT: {
1379 prl_to = sec2annotation(tosec);
1380 fprintf(stderr,
1381 "The variable %s references\n"
1382 "the %s %s%s%s\n"
1383 "If the reference is valid then annotate the\n"
1384 "variable with __init* or __refdata (see linux/init.h) "
1385 "or name the variable:\n",
1386 fromsym, to, prl_to, tosym, to_p);
1387 print_section_list(mismatch->symbol_white_list);
1388 free(prl_to);
1389 break;
1391 case TEXT_TO_ANY_EXIT:
1392 prl_to = sec2annotation(tosec);
1393 fprintf(stderr,
1394 "The function %s() references a %s in an exit section.\n"
1395 "Often the %s %s%s has valid usage outside the exit section\n"
1396 "and the fix is to remove the %sannotation of %s.\n",
1397 fromsym, to, to, tosym, to_p, prl_to, tosym);
1398 free(prl_to);
1399 break;
1400 case DATA_TO_ANY_EXIT: {
1401 prl_to = sec2annotation(tosec);
1402 fprintf(stderr,
1403 "The variable %s references\n"
1404 "the %s %s%s%s\n"
1405 "If the reference is valid then annotate the\n"
1406 "variable with __exit* (see linux/init.h) or "
1407 "name the variable:\n",
1408 fromsym, to, prl_to, tosym, to_p);
1409 print_section_list(mismatch->symbol_white_list);
1410 free(prl_to);
1411 break;
1413 case XXXINIT_TO_SOME_INIT:
1414 case XXXEXIT_TO_SOME_EXIT:
1415 prl_from = sec2annotation(fromsec);
1416 prl_to = sec2annotation(tosec);
1417 fprintf(stderr,
1418 "The %s %s%s%s references\n"
1419 "a %s %s%s%s.\n"
1420 "If %s is only used by %s then\n"
1421 "annotate %s with a matching annotation.\n",
1422 from, prl_from, fromsym, from_p,
1423 to, prl_to, tosym, to_p,
1424 tosym, fromsym, tosym);
1425 free(prl_from);
1426 free(prl_to);
1427 break;
1428 case ANY_INIT_TO_ANY_EXIT:
1429 prl_from = sec2annotation(fromsec);
1430 prl_to = sec2annotation(tosec);
1431 fprintf(stderr,
1432 "The %s %s%s%s references\n"
1433 "a %s %s%s%s.\n"
1434 "This is often seen when error handling "
1435 "in the init function\n"
1436 "uses functionality in the exit path.\n"
1437 "The fix is often to remove the %sannotation of\n"
1438 "%s%s so it may be used outside an exit section.\n",
1439 from, prl_from, fromsym, from_p,
1440 to, prl_to, tosym, to_p,
1441 prl_to, tosym, to_p);
1442 free(prl_from);
1443 free(prl_to);
1444 break;
1445 case ANY_EXIT_TO_ANY_INIT:
1446 prl_from = sec2annotation(fromsec);
1447 prl_to = sec2annotation(tosec);
1448 fprintf(stderr,
1449 "The %s %s%s%s references\n"
1450 "a %s %s%s%s.\n"
1451 "This is often seen when error handling "
1452 "in the exit function\n"
1453 "uses functionality in the init path.\n"
1454 "The fix is often to remove the %sannotation of\n"
1455 "%s%s so it may be used outside an init section.\n",
1456 from, prl_from, fromsym, from_p,
1457 to, prl_to, tosym, to_p,
1458 prl_to, tosym, to_p);
1459 free(prl_from);
1460 free(prl_to);
1461 break;
1462 case EXPORT_TO_INIT_EXIT:
1463 prl_to = sec2annotation(tosec);
1464 fprintf(stderr,
1465 "The symbol %s is exported and annotated %s\n"
1466 "Fix this by removing the %sannotation of %s "
1467 "or drop the export.\n",
1468 tosym, prl_to, prl_to, tosym);
1469 free(prl_to);
1470 break;
1472 fprintf(stderr, "\n");
1475 static void check_section_mismatch(const char *modname, struct elf_info *elf,
1476 Elf_Rela *r, Elf_Sym *sym, const char *fromsec)
1478 const char *tosec;
1479 const struct sectioncheck *mismatch;
1481 tosec = sec_name(elf, get_secindex(elf, sym));
1482 mismatch = section_mismatch(fromsec, tosec);
1483 if (mismatch) {
1484 Elf_Sym *to;
1485 Elf_Sym *from;
1486 const char *tosym;
1487 const char *fromsym;
1489 from = find_elf_symbol2(elf, r->r_offset, fromsec);
1490 fromsym = sym_name(elf, from);
1491 to = find_elf_symbol(elf, r->r_addend, sym);
1492 tosym = sym_name(elf, to);
1494 if (!strncmp(fromsym, "reference___initcall",
1495 sizeof("reference___initcall")-1))
1496 return;
1498 /* check whitelist - we may ignore it */
1499 if (secref_whitelist(mismatch,
1500 fromsec, fromsym, tosec, tosym)) {
1501 report_sec_mismatch(modname, mismatch,
1502 fromsec, r->r_offset, fromsym,
1503 is_function(from), tosec, tosym,
1504 is_function(to));
1509 static unsigned int *reloc_location(struct elf_info *elf,
1510 Elf_Shdr *sechdr, Elf_Rela *r)
1512 Elf_Shdr *sechdrs = elf->sechdrs;
1513 int section = sechdr->sh_info;
1515 return (void *)elf->hdr + sechdrs[section].sh_offset +
1516 r->r_offset;
1519 static int addend_386_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1521 unsigned int r_typ = ELF_R_TYPE(r->r_info);
1522 unsigned int *location = reloc_location(elf, sechdr, r);
1524 switch (r_typ) {
1525 case R_386_32:
1526 r->r_addend = TO_NATIVE(*location);
1527 break;
1528 case R_386_PC32:
1529 r->r_addend = TO_NATIVE(*location) + 4;
1530 /* For CONFIG_RELOCATABLE=y */
1531 if (elf->hdr->e_type == ET_EXEC)
1532 r->r_addend += r->r_offset;
1533 break;
1535 return 0;
1538 #ifndef R_ARM_CALL
1539 #define R_ARM_CALL 28
1540 #endif
1541 #ifndef R_ARM_JUMP24
1542 #define R_ARM_JUMP24 29
1543 #endif
1545 #ifndef R_ARM_THM_CALL
1546 #define R_ARM_THM_CALL 10
1547 #endif
1548 #ifndef R_ARM_THM_JUMP24
1549 #define R_ARM_THM_JUMP24 30
1550 #endif
1551 #ifndef R_ARM_THM_JUMP19
1552 #define R_ARM_THM_JUMP19 51
1553 #endif
1555 static int addend_arm_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1557 unsigned int r_typ = ELF_R_TYPE(r->r_info);
1559 switch (r_typ) {
1560 case R_ARM_ABS32:
1561 /* From ARM ABI: (S + A) | T */
1562 r->r_addend = (int)(long)
1563 (elf->symtab_start + ELF_R_SYM(r->r_info));
1564 break;
1565 case R_ARM_PC24:
1566 case R_ARM_CALL:
1567 case R_ARM_JUMP24:
1568 case R_ARM_THM_CALL:
1569 case R_ARM_THM_JUMP24:
1570 case R_ARM_THM_JUMP19:
1571 /* From ARM ABI: ((S + A) | T) - P */
1572 r->r_addend = (int)(long)(elf->hdr +
1573 sechdr->sh_offset +
1574 (r->r_offset - sechdr->sh_addr));
1575 break;
1576 default:
1577 return 1;
1579 return 0;
1582 static int addend_mips_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1584 unsigned int r_typ = ELF_R_TYPE(r->r_info);
1585 unsigned int *location = reloc_location(elf, sechdr, r);
1586 unsigned int inst;
1588 if (r_typ == R_MIPS_HI16)
1589 return 1; /* skip this */
1590 inst = TO_NATIVE(*location);
1591 switch (r_typ) {
1592 case R_MIPS_LO16:
1593 r->r_addend = inst & 0xffff;
1594 break;
1595 case R_MIPS_26:
1596 r->r_addend = (inst & 0x03ffffff) << 2;
1597 break;
1598 case R_MIPS_32:
1599 r->r_addend = inst;
1600 break;
1602 return 0;
1605 static void section_rela(const char *modname, struct elf_info *elf,
1606 Elf_Shdr *sechdr)
1608 Elf_Sym *sym;
1609 Elf_Rela *rela;
1610 Elf_Rela r;
1611 unsigned int r_sym;
1612 const char *fromsec;
1614 Elf_Rela *start = (void *)elf->hdr + sechdr->sh_offset;
1615 Elf_Rela *stop = (void *)start + sechdr->sh_size;
1617 fromsec = sech_name(elf, sechdr);
1618 fromsec += strlen(".rela");
1619 /* if from section (name) is know good then skip it */
1620 if (match(fromsec, section_white_list))
1621 return;
1623 for (rela = start; rela < stop; rela++) {
1624 r.r_offset = TO_NATIVE(rela->r_offset);
1625 #if KERNEL_ELFCLASS == ELFCLASS64
1626 if (elf->hdr->e_machine == EM_MIPS) {
1627 unsigned int r_typ;
1628 r_sym = ELF64_MIPS_R_SYM(rela->r_info);
1629 r_sym = TO_NATIVE(r_sym);
1630 r_typ = ELF64_MIPS_R_TYPE(rela->r_info);
1631 r.r_info = ELF64_R_INFO(r_sym, r_typ);
1632 } else {
1633 r.r_info = TO_NATIVE(rela->r_info);
1634 r_sym = ELF_R_SYM(r.r_info);
1636 #else
1637 r.r_info = TO_NATIVE(rela->r_info);
1638 r_sym = ELF_R_SYM(r.r_info);
1639 #endif
1640 r.r_addend = TO_NATIVE(rela->r_addend);
1641 sym = elf->symtab_start + r_sym;
1642 /* Skip special sections */
1643 if (is_shndx_special(sym->st_shndx))
1644 continue;
1645 check_section_mismatch(modname, elf, &r, sym, fromsec);
1649 static void section_rel(const char *modname, struct elf_info *elf,
1650 Elf_Shdr *sechdr)
1652 Elf_Sym *sym;
1653 Elf_Rel *rel;
1654 Elf_Rela r;
1655 unsigned int r_sym;
1656 const char *fromsec;
1658 Elf_Rel *start = (void *)elf->hdr + sechdr->sh_offset;
1659 Elf_Rel *stop = (void *)start + sechdr->sh_size;
1661 fromsec = sech_name(elf, sechdr);
1662 fromsec += strlen(".rel");
1663 /* if from section (name) is know good then skip it */
1664 if (match(fromsec, section_white_list))
1665 return;
1667 for (rel = start; rel < stop; rel++) {
1668 r.r_offset = TO_NATIVE(rel->r_offset);
1669 #if KERNEL_ELFCLASS == ELFCLASS64
1670 if (elf->hdr->e_machine == EM_MIPS) {
1671 unsigned int r_typ;
1672 r_sym = ELF64_MIPS_R_SYM(rel->r_info);
1673 r_sym = TO_NATIVE(r_sym);
1674 r_typ = ELF64_MIPS_R_TYPE(rel->r_info);
1675 r.r_info = ELF64_R_INFO(r_sym, r_typ);
1676 } else {
1677 r.r_info = TO_NATIVE(rel->r_info);
1678 r_sym = ELF_R_SYM(r.r_info);
1680 #else
1681 r.r_info = TO_NATIVE(rel->r_info);
1682 r_sym = ELF_R_SYM(r.r_info);
1683 #endif
1684 r.r_addend = 0;
1685 switch (elf->hdr->e_machine) {
1686 case EM_386:
1687 if (addend_386_rel(elf, sechdr, &r))
1688 continue;
1689 break;
1690 case EM_ARM:
1691 if (addend_arm_rel(elf, sechdr, &r))
1692 continue;
1693 break;
1694 case EM_MIPS:
1695 if (addend_mips_rel(elf, sechdr, &r))
1696 continue;
1697 break;
1699 sym = elf->symtab_start + r_sym;
1700 /* Skip special sections */
1701 if (is_shndx_special(sym->st_shndx))
1702 continue;
1703 check_section_mismatch(modname, elf, &r, sym, fromsec);
1708 * A module includes a number of sections that are discarded
1709 * either when loaded or when used as built-in.
1710 * For loaded modules all functions marked __init and all data
1711 * marked __initdata will be discarded when the module has been initialized.
1712 * Likewise for modules used built-in the sections marked __exit
1713 * are discarded because __exit marked function are supposed to be called
1714 * only when a module is unloaded which never happens for built-in modules.
1715 * The check_sec_ref() function traverses all relocation records
1716 * to find all references to a section that reference a section that will
1717 * be discarded and warns about it.
1719 static void check_sec_ref(struct module *mod, const char *modname,
1720 struct elf_info *elf)
1722 int i;
1723 Elf_Shdr *sechdrs = elf->sechdrs;
1725 /* Walk through all sections */
1726 for (i = 0; i < elf->num_sections; i++) {
1727 check_section(modname, elf, &elf->sechdrs[i]);
1728 /* We want to process only relocation sections and not .init */
1729 if (sechdrs[i].sh_type == SHT_RELA)
1730 section_rela(modname, elf, &elf->sechdrs[i]);
1731 else if (sechdrs[i].sh_type == SHT_REL)
1732 section_rel(modname, elf, &elf->sechdrs[i]);
1736 static char *remove_dot(char *s)
1738 char *end;
1739 int n = strcspn(s, ".");
1741 if (n > 0 && s[n] != 0) {
1742 strtoul(s + n + 1, &end, 10);
1743 if (end > s + n + 1 && (*end == '.' || *end == 0))
1744 s[n] = 0;
1746 return s;
1749 static void read_symbols(char *modname)
1751 const char *symname;
1752 char *version;
1753 char *license;
1754 struct module *mod;
1755 struct elf_info info = { };
1756 Elf_Sym *sym;
1758 if (!parse_elf(&info, modname))
1759 return;
1761 mod = new_module(modname);
1763 /* When there's no vmlinux, don't print warnings about
1764 * unresolved symbols (since there'll be too many ;) */
1765 if (is_vmlinux(modname)) {
1766 have_vmlinux = 1;
1767 mod->skip = 1;
1770 license = get_modinfo(info.modinfo, info.modinfo_len, "license");
1771 if (info.modinfo && !license && !is_vmlinux(modname))
1772 warn("modpost: missing MODULE_LICENSE() in %s\n"
1773 "see include/linux/module.h for "
1774 "more information\n", modname);
1775 while (license) {
1776 if (license_is_gpl_compatible(license))
1777 mod->gpl_compatible = 1;
1778 else {
1779 mod->gpl_compatible = 0;
1780 break;
1782 license = get_next_modinfo(info.modinfo, info.modinfo_len,
1783 "license", license);
1786 for (sym = info.symtab_start; sym < info.symtab_stop; sym++) {
1787 symname = remove_dot(info.strtab + sym->st_name);
1789 handle_modversions(mod, &info, sym, symname);
1790 handle_moddevtable(mod, &info, sym, symname);
1792 if (!is_vmlinux(modname) ||
1793 (is_vmlinux(modname) && vmlinux_section_warnings))
1794 check_sec_ref(mod, modname, &info);
1796 version = get_modinfo(info.modinfo, info.modinfo_len, "version");
1797 if (version)
1798 maybe_frob_rcs_version(modname, version, info.modinfo,
1799 version - (char *)info.hdr);
1800 if (version || (all_versions && !is_vmlinux(modname)))
1801 get_src_version(modname, mod->srcversion,
1802 sizeof(mod->srcversion)-1);
1804 parse_elf_finish(&info);
1806 /* Our trick to get versioning for module struct etc. - it's
1807 * never passed as an argument to an exported function, so
1808 * the automatic versioning doesn't pick it up, but it's really
1809 * important anyhow */
1810 if (modversions)
1811 mod->unres = alloc_symbol("module_layout", 0, mod->unres);
1814 static void read_symbols_from_files(const char *filename)
1816 FILE *in = stdin;
1817 char fname[PATH_MAX];
1819 if (strcmp(filename, "-") != 0) {
1820 in = fopen(filename, "r");
1821 if (!in)
1822 fatal("Can't open filenames file %s: %m", filename);
1825 while (fgets(fname, PATH_MAX, in) != NULL) {
1826 if (strends(fname, "\n"))
1827 fname[strlen(fname)-1] = '\0';
1828 read_symbols(fname);
1831 if (in != stdin)
1832 fclose(in);
1835 #define SZ 500
1837 /* We first write the generated file into memory using the
1838 * following helper, then compare to the file on disk and
1839 * only update the later if anything changed */
1841 void __attribute__((format(printf, 2, 3))) buf_printf(struct buffer *buf,
1842 const char *fmt, ...)
1844 char tmp[SZ];
1845 int len;
1846 va_list ap;
1848 va_start(ap, fmt);
1849 len = vsnprintf(tmp, SZ, fmt, ap);
1850 buf_write(buf, tmp, len);
1851 va_end(ap);
1854 void buf_write(struct buffer *buf, const char *s, int len)
1856 if (buf->size - buf->pos < len) {
1857 buf->size += len + SZ;
1858 buf->p = realloc(buf->p, buf->size);
1860 strncpy(buf->p + buf->pos, s, len);
1861 buf->pos += len;
1864 static void check_for_gpl_usage(enum export exp, const char *m, const char *s)
1866 const char *e = is_vmlinux(m) ?"":".ko";
1868 switch (exp) {
1869 case export_gpl:
1870 fatal("modpost: GPL-incompatible module %s%s "
1871 "uses GPL-only symbol '%s'\n", m, e, s);
1872 break;
1873 case export_unused_gpl:
1874 fatal("modpost: GPL-incompatible module %s%s "
1875 "uses GPL-only symbol marked UNUSED '%s'\n", m, e, s);
1876 break;
1877 case export_gpl_future:
1878 warn("modpost: GPL-incompatible module %s%s "
1879 "uses future GPL-only symbol '%s'\n", m, e, s);
1880 break;
1881 case export_plain:
1882 case export_unused:
1883 case export_unknown:
1884 /* ignore */
1885 break;
1889 static void check_for_unused(enum export exp, const char *m, const char *s)
1891 const char *e = is_vmlinux(m) ?"":".ko";
1893 switch (exp) {
1894 case export_unused:
1895 case export_unused_gpl:
1896 warn("modpost: module %s%s "
1897 "uses symbol '%s' marked UNUSED\n", m, e, s);
1898 break;
1899 default:
1900 /* ignore */
1901 break;
1905 static void check_exports(struct module *mod)
1907 struct symbol *s, *exp;
1909 for (s = mod->unres; s; s = s->next) {
1910 const char *basename;
1911 exp = find_symbol(s->name);
1912 if (!exp || exp->module == mod)
1913 continue;
1914 basename = strrchr(mod->name, '/');
1915 if (basename)
1916 basename++;
1917 else
1918 basename = mod->name;
1919 if (!mod->gpl_compatible)
1920 check_for_gpl_usage(exp->export, basename, exp->name);
1921 check_for_unused(exp->export, basename, exp->name);
1926 * Header for the generated file
1928 static void add_header(struct buffer *b, struct module *mod)
1930 buf_printf(b, "#include <linux/module.h>\n");
1931 buf_printf(b, "#include <linux/vermagic.h>\n");
1932 buf_printf(b, "#include <linux/compiler.h>\n");
1933 buf_printf(b, "\n");
1934 buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n");
1935 buf_printf(b, "\n");
1936 buf_printf(b, "__visible struct module __this_module\n");
1937 buf_printf(b, "__attribute__((section(\".gnu.linkonce.this_module\"))) = {\n");
1938 buf_printf(b, "\t.name = KBUILD_MODNAME,\n");
1939 if (mod->has_init)
1940 buf_printf(b, "\t.init = init_module,\n");
1941 if (mod->has_cleanup)
1942 buf_printf(b, "#ifdef CONFIG_MODULE_UNLOAD\n"
1943 "\t.exit = cleanup_module,\n"
1944 "#endif\n");
1945 buf_printf(b, "\t.arch = MODULE_ARCH_INIT,\n");
1946 buf_printf(b, "};\n");
1949 static void add_intree_flag(struct buffer *b, int is_intree)
1951 if (is_intree)
1952 buf_printf(b, "\nMODULE_INFO(intree, \"Y\");\n");
1955 /* Cannot check for assembler */
1956 static void add_retpoline(struct buffer *b)
1958 buf_printf(b, "\n#ifdef RETPOLINE\n");
1959 buf_printf(b, "MODULE_INFO(retpoline, \"Y\");\n");
1960 buf_printf(b, "#endif\n");
1963 static void add_staging_flag(struct buffer *b, const char *name)
1965 static const char *staging_dir = "drivers/staging";
1967 if (strncmp(staging_dir, name, strlen(staging_dir)) == 0)
1968 buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n");
1972 * Record CRCs for unresolved symbols
1974 static int add_versions(struct buffer *b, struct module *mod)
1976 struct symbol *s, *exp;
1977 int err = 0;
1979 for (s = mod->unres; s; s = s->next) {
1980 exp = find_symbol(s->name);
1981 if (!exp || exp->module == mod) {
1982 if (have_vmlinux && !s->weak) {
1983 if (warn_unresolved) {
1984 warn("\"%s\" [%s.ko] undefined!\n",
1985 s->name, mod->name);
1986 } else {
1987 merror("\"%s\" [%s.ko] undefined!\n",
1988 s->name, mod->name);
1989 err = 1;
1992 continue;
1994 s->module = exp->module;
1995 s->crc_valid = exp->crc_valid;
1996 s->crc = exp->crc;
1999 if (!modversions)
2000 return err;
2002 buf_printf(b, "\n");
2003 buf_printf(b, "static const struct modversion_info ____versions[]\n");
2004 buf_printf(b, "__used\n");
2005 buf_printf(b, "__attribute__((section(\"__versions\"))) = {\n");
2007 for (s = mod->unres; s; s = s->next) {
2008 if (!s->module)
2009 continue;
2010 if (!s->crc_valid) {
2011 warn("\"%s\" [%s.ko] has no CRC!\n",
2012 s->name, mod->name);
2013 continue;
2015 buf_printf(b, "\t{ %#8x, __VMLINUX_SYMBOL_STR(%s) },\n",
2016 s->crc, s->name);
2019 buf_printf(b, "};\n");
2021 return err;
2024 static void add_depends(struct buffer *b, struct module *mod,
2025 struct module *modules)
2027 struct symbol *s;
2028 struct module *m;
2029 int first = 1;
2031 for (m = modules; m; m = m->next)
2032 m->seen = is_vmlinux(m->name);
2034 buf_printf(b, "\n");
2035 buf_printf(b, "static const char __module_depends[]\n");
2036 buf_printf(b, "__used\n");
2037 buf_printf(b, "__attribute__((section(\".modinfo\"))) =\n");
2038 buf_printf(b, "\"depends=");
2039 for (s = mod->unres; s; s = s->next) {
2040 const char *p;
2041 if (!s->module)
2042 continue;
2044 if (s->module->seen)
2045 continue;
2047 s->module->seen = 1;
2048 p = strrchr(s->module->name, '/');
2049 if (p)
2050 p++;
2051 else
2052 p = s->module->name;
2053 buf_printf(b, "%s%s", first ? "" : ",", p);
2054 first = 0;
2056 buf_printf(b, "\";\n");
2059 static void add_srcversion(struct buffer *b, struct module *mod)
2061 if (mod->srcversion[0]) {
2062 buf_printf(b, "\n");
2063 buf_printf(b, "MODULE_INFO(srcversion, \"%s\");\n",
2064 mod->srcversion);
2068 static void write_if_changed(struct buffer *b, const char *fname)
2070 char *tmp;
2071 FILE *file;
2072 struct stat st;
2074 file = fopen(fname, "r");
2075 if (!file)
2076 goto write;
2078 if (fstat(fileno(file), &st) < 0)
2079 goto close_write;
2081 if (st.st_size != b->pos)
2082 goto close_write;
2084 tmp = NOFAIL(malloc(b->pos));
2085 if (fread(tmp, 1, b->pos, file) != b->pos)
2086 goto free_write;
2088 if (memcmp(tmp, b->p, b->pos) != 0)
2089 goto free_write;
2091 free(tmp);
2092 fclose(file);
2093 return;
2095 free_write:
2096 free(tmp);
2097 close_write:
2098 fclose(file);
2099 write:
2100 file = fopen(fname, "w");
2101 if (!file) {
2102 perror(fname);
2103 exit(1);
2105 if (fwrite(b->p, 1, b->pos, file) != b->pos) {
2106 perror(fname);
2107 exit(1);
2109 fclose(file);
2112 /* parse Module.symvers file. line format:
2113 * 0x12345678<tab>symbol<tab>module[[<tab>export]<tab>something]
2115 static void read_dump(const char *fname, unsigned int kernel)
2117 unsigned long size, pos = 0;
2118 void *file = grab_file(fname, &size);
2119 char *line;
2121 if (!file)
2122 /* No symbol versions, silently ignore */
2123 return;
2125 while ((line = get_next_line(&pos, file, size))) {
2126 char *symname, *modname, *d, *export, *end;
2127 unsigned int crc;
2128 struct module *mod;
2129 struct symbol *s;
2131 if (!(symname = strchr(line, '\t')))
2132 goto fail;
2133 *symname++ = '\0';
2134 if (!(modname = strchr(symname, '\t')))
2135 goto fail;
2136 *modname++ = '\0';
2137 if ((export = strchr(modname, '\t')) != NULL)
2138 *export++ = '\0';
2139 if (export && ((end = strchr(export, '\t')) != NULL))
2140 *end = '\0';
2141 crc = strtoul(line, &d, 16);
2142 if (*symname == '\0' || *modname == '\0' || *d != '\0')
2143 goto fail;
2144 mod = find_module(modname);
2145 if (!mod) {
2146 if (is_vmlinux(modname))
2147 have_vmlinux = 1;
2148 mod = new_module(modname);
2149 mod->skip = 1;
2151 s = sym_add_exported(symname, mod, export_no(export));
2152 s->kernel = kernel;
2153 s->preloaded = 1;
2154 sym_update_crc(symname, mod, crc, export_no(export));
2156 release_file(file, size);
2157 return;
2158 fail:
2159 release_file(file, size);
2160 fatal("parse error in symbol dump file\n");
2163 /* For normal builds always dump all symbols.
2164 * For external modules only dump symbols
2165 * that are not read from kernel Module.symvers.
2167 static int dump_sym(struct symbol *sym)
2169 if (!external_module)
2170 return 1;
2171 if (sym->vmlinux || sym->kernel)
2172 return 0;
2173 return 1;
2176 static void write_dump(const char *fname)
2178 struct buffer buf = { };
2179 struct symbol *symbol;
2180 int n;
2182 for (n = 0; n < SYMBOL_HASH_SIZE ; n++) {
2183 symbol = symbolhash[n];
2184 while (symbol) {
2185 if (dump_sym(symbol))
2186 buf_printf(&buf, "0x%08x\t%s\t%s\t%s\n",
2187 symbol->crc, symbol->name,
2188 symbol->module->name,
2189 export_str(symbol->export));
2190 symbol = symbol->next;
2193 write_if_changed(&buf, fname);
2196 struct ext_sym_list {
2197 struct ext_sym_list *next;
2198 const char *file;
2201 int main(int argc, char **argv)
2203 struct module *mod;
2204 struct buffer buf = { };
2205 char *kernel_read = NULL, *module_read = NULL;
2206 char *dump_write = NULL, *files_source = NULL;
2207 int opt;
2208 int err;
2209 struct ext_sym_list *extsym_iter;
2210 struct ext_sym_list *extsym_start = NULL;
2212 while ((opt = getopt(argc, argv, "i:I:e:mnsST:o:awM:K:")) != -1) {
2213 switch (opt) {
2214 case 'i':
2215 kernel_read = optarg;
2216 break;
2217 case 'I':
2218 module_read = optarg;
2219 external_module = 1;
2220 break;
2221 case 'e':
2222 external_module = 1;
2223 extsym_iter =
2224 NOFAIL(malloc(sizeof(*extsym_iter)));
2225 extsym_iter->next = extsym_start;
2226 extsym_iter->file = optarg;
2227 extsym_start = extsym_iter;
2228 break;
2229 case 'm':
2230 modversions = 1;
2231 break;
2232 case 'n':
2233 ignore_missing_files = 1;
2234 break;
2235 case 'o':
2236 dump_write = optarg;
2237 break;
2238 case 'a':
2239 all_versions = 1;
2240 break;
2241 case 's':
2242 vmlinux_section_warnings = 0;
2243 break;
2244 case 'S':
2245 sec_mismatch_verbose = 0;
2246 break;
2247 case 'T':
2248 files_source = optarg;
2249 break;
2250 case 'w':
2251 warn_unresolved = 1;
2252 break;
2253 default:
2254 exit(1);
2258 if (kernel_read)
2259 read_dump(kernel_read, 1);
2260 if (module_read)
2261 read_dump(module_read, 0);
2262 while (extsym_start) {
2263 read_dump(extsym_start->file, 0);
2264 extsym_iter = extsym_start->next;
2265 free(extsym_start);
2266 extsym_start = extsym_iter;
2269 while (optind < argc)
2270 read_symbols(argv[optind++]);
2272 if (files_source)
2273 read_symbols_from_files(files_source);
2275 for (mod = modules; mod; mod = mod->next) {
2276 if (mod->skip)
2277 continue;
2278 check_exports(mod);
2281 err = 0;
2283 for (mod = modules; mod; mod = mod->next) {
2284 char fname[strlen(mod->name) + 10];
2286 if (mod->skip)
2287 continue;
2289 buf.pos = 0;
2291 add_header(&buf, mod);
2292 add_intree_flag(&buf, !external_module);
2293 add_retpoline(&buf);
2294 add_staging_flag(&buf, mod->name);
2295 err |= add_versions(&buf, mod);
2296 add_depends(&buf, mod, modules);
2297 add_moddevtable(&buf, mod);
2298 add_srcversion(&buf, mod);
2300 sprintf(fname, "%s.mod.c", mod->name);
2301 write_if_changed(&buf, fname);
2304 if (dump_write)
2305 write_dump(dump_write);
2306 if (sec_mismatch_count && !sec_mismatch_verbose)
2307 warn("modpost: Found %d section mismatch(es).\n"
2308 "To see full details build your kernel with:\n"
2309 "'make CONFIG_DEBUG_SECTION_MISMATCH=y'\n",
2310 sec_mismatch_count);
2312 return err;