1 /* Postprocess module symbol versions
2 *
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
7 *
8 * This software may be used and distributed according to the terms
9 * of the GNU General Public License, incorporated herein by reference.
10 *
11 * Usage: modpost vmlinux module1.o module2.o ...
12 */
13
14 #define _GNU_SOURCE
15 #include <stdio.h>
16 #include <ctype.h>
17 #include <string.h>
18 #include <limits.h>
19 #include <stdbool.h>
20 #include <errno.h>
21 #include "modpost.h"
22 #include "../../include/generated/autoconf.h"
23 #include "../../include/linux/license.h"
24 #include "../../include/linux/export.h"
25
26 /* 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 static int sec_mismatch_fatal = 0;
42 /* ignore missing files */
43 static int ignore_missing_files;
44
45 enum export {
46 export_plain, export_unused, export_gpl,
47 export_unused_gpl, export_gpl_future, export_unknown
48 };
49
50 /* In kernel, this size is defined in linux/module.h;
51 * here we use Elf_Addr instead of long for covering cross-compile
52 */
53
54 #define MODULE_NAME_LEN (64 - sizeof(Elf_Addr))
55
56 #define PRINTF __attribute__ ((format (printf, 1, 2)))
57
fatal(const char * fmt,...)58 PRINTF void fatal(const char *fmt, ...)
59 {
60 va_list arglist;
61
62 fprintf(stderr, "FATAL: ");
63
64 va_start(arglist, fmt);
65 vfprintf(stderr, fmt, arglist);
66 va_end(arglist);
67
68 exit(1);
69 }
70
warn(const char * fmt,...)71 PRINTF void warn(const char *fmt, ...)
72 {
73 va_list arglist;
74
75 fprintf(stderr, "WARNING: ");
76
77 va_start(arglist, fmt);
78 vfprintf(stderr, fmt, arglist);
79 va_end(arglist);
80 }
81
merror(const char * fmt,...)82 PRINTF void merror(const char *fmt, ...)
83 {
84 va_list arglist;
85
86 fprintf(stderr, "ERROR: ");
87
88 va_start(arglist, fmt);
89 vfprintf(stderr, fmt, arglist);
90 va_end(arglist);
91 }
92
strends(const char * str,const char * postfix)93 static inline bool strends(const char *str, const char *postfix)
94 {
95 if (strlen(str) < strlen(postfix))
96 return false;
97
98 return strcmp(str + strlen(str) - strlen(postfix), postfix) == 0;
99 }
100
is_vmlinux(const char * modname)101 static int is_vmlinux(const char *modname)
102 {
103 const char *myname;
104
105 myname = strrchr(modname, '/');
106 if (myname)
107 myname++;
108 else
109 myname = modname;
110
111 return (strcmp(myname, "vmlinux") == 0) ||
112 (strcmp(myname, "vmlinux.o") == 0);
113 }
114
do_nofail(void * ptr,const char * expr)115 void *do_nofail(void *ptr, const char *expr)
116 {
117 if (!ptr)
118 fatal("modpost: Memory allocation failure: %s.\n", expr);
119
120 return ptr;
121 }
122
123 /* A list of all modules we processed */
124 static struct module *modules;
125
find_module(char * modname)126 static struct module *find_module(char *modname)
127 {
128 struct module *mod;
129
130 for (mod = modules; mod; mod = mod->next)
131 if (strcmp(mod->name, modname) == 0)
132 break;
133 return mod;
134 }
135
new_module(const char * modname)136 static struct module *new_module(const char *modname)
137 {
138 struct module *mod;
139 char *p;
140
141 mod = NOFAIL(malloc(sizeof(*mod)));
142 memset(mod, 0, sizeof(*mod));
143 p = NOFAIL(strdup(modname));
144
145 /* strip trailing .o */
146 if (strends(p, ".o")) {
147 p[strlen(p) - 2] = '\0';
148 mod->is_dot_o = 1;
149 }
150
151 /* add to list */
152 mod->name = p;
153 mod->gpl_compatible = -1;
154 mod->next = modules;
155 modules = mod;
156
157 return mod;
158 }
159
160 /* A hash of all exported symbols,
161 * struct symbol is also used for lists of unresolved symbols */
162
163 #define SYMBOL_HASH_SIZE 1024
164
165 struct symbol {
166 struct symbol *next;
167 struct module *module;
168 unsigned int crc;
169 int crc_valid;
170 unsigned int weak:1;
171 unsigned int vmlinux:1; /* 1 if symbol is defined in vmlinux */
172 unsigned int kernel:1; /* 1 if symbol is from kernel
173 * (only for external modules) **/
174 unsigned int preloaded:1; /* 1 if symbol from Module.symvers, or crc */
175 enum export export; /* Type of export */
176 char name[0];
177 };
178
179 static struct symbol *symbolhash[SYMBOL_HASH_SIZE];
180
181 /* This is based on the hash agorithm from gdbm, via tdb */
tdb_hash(const char * name)182 static inline unsigned int tdb_hash(const char *name)
183 {
184 unsigned value; /* Used to compute the hash value. */
185 unsigned i; /* Used to cycle through random values. */
186
187 /* Set the initial value from the key size. */
188 for (value = 0x238F13AF * strlen(name), i = 0; name[i]; i++)
189 value = (value + (((unsigned char *)name)[i] << (i*5 % 24)));
190
191 return (1103515243 * value + 12345);
192 }
193
194 /**
195 * Allocate a new symbols for use in the hash of exported symbols or
196 * the list of unresolved symbols per module
197 **/
alloc_symbol(const char * name,unsigned int weak,struct symbol * next)198 static struct symbol *alloc_symbol(const char *name, unsigned int weak,
199 struct symbol *next)
200 {
201 struct symbol *s = NOFAIL(malloc(sizeof(*s) + strlen(name) + 1));
202
203 memset(s, 0, sizeof(*s));
204 strcpy(s->name, name);
205 s->weak = weak;
206 s->next = next;
207 return s;
208 }
209
210 /* For the hash of exported symbols */
new_symbol(const char * name,struct module * module,enum export export)211 static struct symbol *new_symbol(const char *name, struct module *module,
212 enum export export)
213 {
214 unsigned int hash;
215 struct symbol *new;
216
217 hash = tdb_hash(name) % SYMBOL_HASH_SIZE;
218 new = symbolhash[hash] = alloc_symbol(name, 0, symbolhash[hash]);
219 new->module = module;
220 new->export = export;
221 return new;
222 }
223
find_symbol(const char * name)224 static struct symbol *find_symbol(const char *name)
225 {
226 struct symbol *s;
227
228 /* For our purposes, .foo matches foo. PPC64 needs this. */
229 if (name[0] == '.')
230 name++;
231
232 for (s = symbolhash[tdb_hash(name) % SYMBOL_HASH_SIZE]; s; s = s->next) {
233 if (strcmp(s->name, name) == 0)
234 return s;
235 }
236 return NULL;
237 }
238
239 static const struct {
240 const char *str;
241 enum export export;
242 } export_list[] = {
243 { .str = "EXPORT_SYMBOL", .export = export_plain },
244 { .str = "EXPORT_UNUSED_SYMBOL", .export = export_unused },
245 { .str = "EXPORT_SYMBOL_GPL", .export = export_gpl },
246 { .str = "EXPORT_UNUSED_SYMBOL_GPL", .export = export_unused_gpl },
247 { .str = "EXPORT_SYMBOL_GPL_FUTURE", .export = export_gpl_future },
248 { .str = "(unknown)", .export = export_unknown },
249 };
250
251
export_str(enum export ex)252 static const char *export_str(enum export ex)
253 {
254 return export_list[ex].str;
255 }
256
export_no(const char * s)257 static enum export export_no(const char *s)
258 {
259 int i;
260
261 if (!s)
262 return export_unknown;
263 for (i = 0; export_list[i].export != export_unknown; i++) {
264 if (strcmp(export_list[i].str, s) == 0)
265 return export_list[i].export;
266 }
267 return export_unknown;
268 }
269
sech_name(struct elf_info * elf,Elf_Shdr * sechdr)270 static const char *sech_name(struct elf_info *elf, Elf_Shdr *sechdr)
271 {
272 return (void *)elf->hdr +
273 elf->sechdrs[elf->secindex_strings].sh_offset +
274 sechdr->sh_name;
275 }
276
sec_name(struct elf_info * elf,int secindex)277 static const char *sec_name(struct elf_info *elf, int secindex)
278 {
279 return sech_name(elf, &elf->sechdrs[secindex]);
280 }
281
282 #define strstarts(str, prefix) (strncmp(str, prefix, strlen(prefix)) == 0)
283
export_from_secname(struct elf_info * elf,unsigned int sec)284 static enum export export_from_secname(struct elf_info *elf, unsigned int sec)
285 {
286 const char *secname = sec_name(elf, sec);
287
288 if (strstarts(secname, "___ksymtab+"))
289 return export_plain;
290 else if (strstarts(secname, "___ksymtab_unused+"))
291 return export_unused;
292 else if (strstarts(secname, "___ksymtab_gpl+"))
293 return export_gpl;
294 else if (strstarts(secname, "___ksymtab_unused_gpl+"))
295 return export_unused_gpl;
296 else if (strstarts(secname, "___ksymtab_gpl_future+"))
297 return export_gpl_future;
298 else
299 return export_unknown;
300 }
301
export_from_sec(struct elf_info * elf,unsigned int sec)302 static enum export export_from_sec(struct elf_info *elf, unsigned int sec)
303 {
304 if (sec == elf->export_sec)
305 return export_plain;
306 else if (sec == elf->export_unused_sec)
307 return export_unused;
308 else if (sec == elf->export_gpl_sec)
309 return export_gpl;
310 else if (sec == elf->export_unused_gpl_sec)
311 return export_unused_gpl;
312 else if (sec == elf->export_gpl_future_sec)
313 return export_gpl_future;
314 else
315 return export_unknown;
316 }
317
318 /**
319 * Add an exported symbol - it may have already been added without a
320 * CRC, in this case just update the CRC
321 **/
sym_add_exported(const char * name,struct module * mod,enum export export)322 static struct symbol *sym_add_exported(const char *name, struct module *mod,
323 enum export export)
324 {
325 struct symbol *s = find_symbol(name);
326
327 if (!s) {
328 s = new_symbol(name, mod, export);
329 } else {
330 if (!s->preloaded) {
331 warn("%s: '%s' exported twice. Previous export "
332 "was in %s%s\n", mod->name, name,
333 s->module->name,
334 is_vmlinux(s->module->name) ?"":".ko");
335 } else {
336 /* In case Module.symvers was out of date */
337 s->module = mod;
338 }
339 }
340 s->preloaded = 0;
341 s->vmlinux = is_vmlinux(mod->name);
342 s->kernel = 0;
343 s->export = export;
344 return s;
345 }
346
sym_update_crc(const char * name,struct module * mod,unsigned int crc,enum export export)347 static void sym_update_crc(const char *name, struct module *mod,
348 unsigned int crc, enum export export)
349 {
350 struct symbol *s = find_symbol(name);
351
352 if (!s) {
353 s = new_symbol(name, mod, export);
354 /* Don't complain when we find it later. */
355 s->preloaded = 1;
356 }
357 s->crc = crc;
358 s->crc_valid = 1;
359 }
360
grab_file(const char * filename,unsigned long * size)361 void *grab_file(const char *filename, unsigned long *size)
362 {
363 struct stat st;
364 void *map = MAP_FAILED;
365 int fd;
366
367 fd = open(filename, O_RDONLY);
368 if (fd < 0)
369 return NULL;
370 if (fstat(fd, &st))
371 goto failed;
372
373 *size = st.st_size;
374 map = mmap(NULL, *size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
375
376 failed:
377 close(fd);
378 if (map == MAP_FAILED)
379 return NULL;
380 return map;
381 }
382
383 /**
384 * Return a copy of the next line in a mmap'ed file.
385 * spaces in the beginning of the line is trimmed away.
386 * Return a pointer to a static buffer.
387 **/
get_next_line(unsigned long * pos,void * file,unsigned long size)388 char *get_next_line(unsigned long *pos, void *file, unsigned long size)
389 {
390 static char line[4096];
391 int skip = 1;
392 size_t len = 0;
393 signed char *p = (signed char *)file + *pos;
394 char *s = line;
395
396 for (; *pos < size ; (*pos)++) {
397 if (skip && isspace(*p)) {
398 p++;
399 continue;
400 }
401 skip = 0;
402 if (*p != '\n' && (*pos < size)) {
403 len++;
404 *s++ = *p++;
405 if (len > 4095)
406 break; /* Too long, stop */
407 } else {
408 /* End of string */
409 *s = '\0';
410 return line;
411 }
412 }
413 /* End of buffer */
414 return NULL;
415 }
416
release_file(void * file,unsigned long size)417 void release_file(void *file, unsigned long size)
418 {
419 munmap(file, size);
420 }
421
parse_elf(struct elf_info * info,const char * filename)422 static int parse_elf(struct elf_info *info, const char *filename)
423 {
424 unsigned int i;
425 Elf_Ehdr *hdr;
426 Elf_Shdr *sechdrs;
427 Elf_Sym *sym;
428 const char *secstrings;
429 unsigned int symtab_idx = ~0U, symtab_shndx_idx = ~0U;
430
431 hdr = grab_file(filename, &info->size);
432 if (!hdr) {
433 if (ignore_missing_files) {
434 fprintf(stderr, "%s: %s (ignored)\n", filename,
435 strerror(errno));
436 return 0;
437 }
438 perror(filename);
439 exit(1);
440 }
441 info->hdr = hdr;
442 if (info->size < sizeof(*hdr)) {
443 /* file too small, assume this is an empty .o file */
444 return 0;
445 }
446 /* Is this a valid ELF file? */
447 if ((hdr->e_ident[EI_MAG0] != ELFMAG0) ||
448 (hdr->e_ident[EI_MAG1] != ELFMAG1) ||
449 (hdr->e_ident[EI_MAG2] != ELFMAG2) ||
450 (hdr->e_ident[EI_MAG3] != ELFMAG3)) {
451 /* Not an ELF file - silently ignore it */
452 return 0;
453 }
454 /* Fix endianness in ELF header */
455 hdr->e_type = TO_NATIVE(hdr->e_type);
456 hdr->e_machine = TO_NATIVE(hdr->e_machine);
457 hdr->e_version = TO_NATIVE(hdr->e_version);
458 hdr->e_entry = TO_NATIVE(hdr->e_entry);
459 hdr->e_phoff = TO_NATIVE(hdr->e_phoff);
460 hdr->e_shoff = TO_NATIVE(hdr->e_shoff);
461 hdr->e_flags = TO_NATIVE(hdr->e_flags);
462 hdr->e_ehsize = TO_NATIVE(hdr->e_ehsize);
463 hdr->e_phentsize = TO_NATIVE(hdr->e_phentsize);
464 hdr->e_phnum = TO_NATIVE(hdr->e_phnum);
465 hdr->e_shentsize = TO_NATIVE(hdr->e_shentsize);
466 hdr->e_shnum = TO_NATIVE(hdr->e_shnum);
467 hdr->e_shstrndx = TO_NATIVE(hdr->e_shstrndx);
468 sechdrs = (void *)hdr + hdr->e_shoff;
469 info->sechdrs = sechdrs;
470
471 /* Check if file offset is correct */
472 if (hdr->e_shoff > info->size) {
473 fatal("section header offset=%lu in file '%s' is bigger than "
474 "filesize=%lu\n", (unsigned long)hdr->e_shoff,
475 filename, info->size);
476 return 0;
477 }
478
479 if (hdr->e_shnum == SHN_UNDEF) {
480 /*
481 * There are more than 64k sections,
482 * read count from .sh_size.
483 */
484 info->num_sections = TO_NATIVE(sechdrs[0].sh_size);
485 }
486 else {
487 info->num_sections = hdr->e_shnum;
488 }
489 if (hdr->e_shstrndx == SHN_XINDEX) {
490 info->secindex_strings = TO_NATIVE(sechdrs[0].sh_link);
491 }
492 else {
493 info->secindex_strings = hdr->e_shstrndx;
494 }
495
496 /* Fix endianness in section headers */
497 for (i = 0; i < info->num_sections; i++) {
498 sechdrs[i].sh_name = TO_NATIVE(sechdrs[i].sh_name);
499 sechdrs[i].sh_type = TO_NATIVE(sechdrs[i].sh_type);
500 sechdrs[i].sh_flags = TO_NATIVE(sechdrs[i].sh_flags);
501 sechdrs[i].sh_addr = TO_NATIVE(sechdrs[i].sh_addr);
502 sechdrs[i].sh_offset = TO_NATIVE(sechdrs[i].sh_offset);
503 sechdrs[i].sh_size = TO_NATIVE(sechdrs[i].sh_size);
504 sechdrs[i].sh_link = TO_NATIVE(sechdrs[i].sh_link);
505 sechdrs[i].sh_info = TO_NATIVE(sechdrs[i].sh_info);
506 sechdrs[i].sh_addralign = TO_NATIVE(sechdrs[i].sh_addralign);
507 sechdrs[i].sh_entsize = TO_NATIVE(sechdrs[i].sh_entsize);
508 }
509 /* Find symbol table. */
510 secstrings = (void *)hdr + sechdrs[info->secindex_strings].sh_offset;
511 for (i = 1; i < info->num_sections; i++) {
512 const char *secname;
513 int nobits = sechdrs[i].sh_type == SHT_NOBITS;
514
515 if (!nobits && sechdrs[i].sh_offset > info->size) {
516 fatal("%s is truncated. sechdrs[i].sh_offset=%lu > "
517 "sizeof(*hrd)=%zu\n", filename,
518 (unsigned long)sechdrs[i].sh_offset,
519 sizeof(*hdr));
520 return 0;
521 }
522 secname = secstrings + sechdrs[i].sh_name;
523 if (strcmp(secname, ".modinfo") == 0) {
524 if (nobits)
525 fatal("%s has NOBITS .modinfo\n", filename);
526 info->modinfo = (void *)hdr + sechdrs[i].sh_offset;
527 info->modinfo_len = sechdrs[i].sh_size;
528 } else if (strcmp(secname, "__ksymtab") == 0)
529 info->export_sec = i;
530 else if (strcmp(secname, "__ksymtab_unused") == 0)
531 info->export_unused_sec = i;
532 else if (strcmp(secname, "__ksymtab_gpl") == 0)
533 info->export_gpl_sec = i;
534 else if (strcmp(secname, "__ksymtab_unused_gpl") == 0)
535 info->export_unused_gpl_sec = i;
536 else if (strcmp(secname, "__ksymtab_gpl_future") == 0)
537 info->export_gpl_future_sec = i;
538
539 if (sechdrs[i].sh_type == SHT_SYMTAB) {
540 unsigned int sh_link_idx;
541 symtab_idx = i;
542 info->symtab_start = (void *)hdr +
543 sechdrs[i].sh_offset;
544 info->symtab_stop = (void *)hdr +
545 sechdrs[i].sh_offset + sechdrs[i].sh_size;
546 sh_link_idx = sechdrs[i].sh_link;
547 info->strtab = (void *)hdr +
548 sechdrs[sh_link_idx].sh_offset;
549 }
550
551 /* 32bit section no. table? ("more than 64k sections") */
552 if (sechdrs[i].sh_type == SHT_SYMTAB_SHNDX) {
553 symtab_shndx_idx = i;
554 info->symtab_shndx_start = (void *)hdr +
555 sechdrs[i].sh_offset;
556 info->symtab_shndx_stop = (void *)hdr +
557 sechdrs[i].sh_offset + sechdrs[i].sh_size;
558 }
559 }
560 if (!info->symtab_start)
561 fatal("%s has no symtab?\n", filename);
562
563 /* Fix endianness in symbols */
564 for (sym = info->symtab_start; sym < info->symtab_stop; sym++) {
565 sym->st_shndx = TO_NATIVE(sym->st_shndx);
566 sym->st_name = TO_NATIVE(sym->st_name);
567 sym->st_value = TO_NATIVE(sym->st_value);
568 sym->st_size = TO_NATIVE(sym->st_size);
569 }
570
571 if (symtab_shndx_idx != ~0U) {
572 Elf32_Word *p;
573 if (symtab_idx != sechdrs[symtab_shndx_idx].sh_link)
574 fatal("%s: SYMTAB_SHNDX has bad sh_link: %u!=%u\n",
575 filename, sechdrs[symtab_shndx_idx].sh_link,
576 symtab_idx);
577 /* Fix endianness */
578 for (p = info->symtab_shndx_start; p < info->symtab_shndx_stop;
579 p++)
580 *p = TO_NATIVE(*p);
581 }
582
583 return 1;
584 }
585
parse_elf_finish(struct elf_info * info)586 static void parse_elf_finish(struct elf_info *info)
587 {
588 release_file(info->hdr, info->size);
589 }
590
ignore_undef_symbol(struct elf_info * info,const char * symname)591 static int ignore_undef_symbol(struct elf_info *info, const char *symname)
592 {
593 /* ignore __this_module, it will be resolved shortly */
594 if (strcmp(symname, VMLINUX_SYMBOL_STR(__this_module)) == 0)
595 return 1;
596 /* ignore global offset table */
597 if (strcmp(symname, "_GLOBAL_OFFSET_TABLE_") == 0)
598 return 1;
599 if (info->hdr->e_machine == EM_PPC)
600 /* Special register function linked on all modules during final link of .ko */
601 if (strncmp(symname, "_restgpr_", sizeof("_restgpr_") - 1) == 0 ||
602 strncmp(symname, "_savegpr_", sizeof("_savegpr_") - 1) == 0 ||
603 strncmp(symname, "_rest32gpr_", sizeof("_rest32gpr_") - 1) == 0 ||
604 strncmp(symname, "_save32gpr_", sizeof("_save32gpr_") - 1) == 0 ||
605 strncmp(symname, "_restvr_", sizeof("_restvr_") - 1) == 0 ||
606 strncmp(symname, "_savevr_", sizeof("_savevr_") - 1) == 0)
607 return 1;
608 if (info->hdr->e_machine == EM_PPC64)
609 /* Special register function linked on all modules during final link of .ko */
610 if (strncmp(symname, "_restgpr0_", sizeof("_restgpr0_") - 1) == 0 ||
611 strncmp(symname, "_savegpr0_", sizeof("_savegpr0_") - 1) == 0 ||
612 strncmp(symname, "_restvr_", sizeof("_restvr_") - 1) == 0 ||
613 strncmp(symname, "_savevr_", sizeof("_savevr_") - 1) == 0 ||
614 strcmp(symname, ".TOC.") == 0)
615 return 1;
616 /* Do not ignore this symbol */
617 return 0;
618 }
619
620 #define CRC_PFX VMLINUX_SYMBOL_STR(__crc_)
621 #define KSYMTAB_PFX VMLINUX_SYMBOL_STR(__ksymtab_)
622
handle_modversions(struct module * mod,struct elf_info * info,Elf_Sym * sym,const char * symname)623 static void handle_modversions(struct module *mod, struct elf_info *info,
624 Elf_Sym *sym, const char *symname)
625 {
626 unsigned int crc;
627 enum export export;
628 bool is_crc = false;
629
630 if ((!is_vmlinux(mod->name) || mod->is_dot_o) &&
631 strncmp(symname, "__ksymtab", 9) == 0)
632 export = export_from_secname(info, get_secindex(info, sym));
633 else
634 export = export_from_sec(info, get_secindex(info, sym));
635
636 /* CRC'd symbol */
637 if (strncmp(symname, CRC_PFX, strlen(CRC_PFX)) == 0) {
638 is_crc = true;
639 crc = (unsigned int) sym->st_value;
640 if (sym->st_shndx != SHN_UNDEF && sym->st_shndx != SHN_ABS) {
641 unsigned int *crcp;
642
643 /* symbol points to the CRC in the ELF object */
644 crcp = (void *)info->hdr + sym->st_value +
645 info->sechdrs[sym->st_shndx].sh_offset -
646 (info->hdr->e_type != ET_REL ?
647 info->sechdrs[sym->st_shndx].sh_addr : 0);
648 crc = TO_NATIVE(*crcp);
649 }
650 sym_update_crc(symname + strlen(CRC_PFX), mod, crc,
651 export);
652 }
653
654 switch (sym->st_shndx) {
655 case SHN_COMMON:
656 if (!strncmp(symname, "__gnu_lto_", sizeof("__gnu_lto_")-1)) {
657 /* Should warn here, but modpost runs before the linker */
658 } else
659 warn("\"%s\" [%s] is COMMON symbol\n", symname, mod->name);
660 break;
661 case SHN_UNDEF:
662 /* undefined symbol */
663 if (ELF_ST_BIND(sym->st_info) != STB_GLOBAL &&
664 ELF_ST_BIND(sym->st_info) != STB_WEAK)
665 break;
666 if (ignore_undef_symbol(info, symname))
667 break;
668 /* cope with newer glibc (2.3.4 or higher) STT_ definition in elf.h */
669 #if defined(STT_REGISTER) || defined(STT_SPARC_REGISTER)
670 /* add compatibility with older glibc */
671 #ifndef STT_SPARC_REGISTER
672 #define STT_SPARC_REGISTER STT_REGISTER
673 #endif
674 if (info->hdr->e_machine == EM_SPARC ||
675 info->hdr->e_machine == EM_SPARCV9) {
676 /* Ignore register directives. */
677 if (ELF_ST_TYPE(sym->st_info) == STT_SPARC_REGISTER)
678 break;
679 if (symname[0] == '.') {
680 char *munged = NOFAIL(strdup(symname));
681 munged[0] = '_';
682 munged[1] = toupper(munged[1]);
683 symname = munged;
684 }
685 }
686 #endif
687
688 #ifdef CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX
689 if (symname[0] != '_')
690 break;
691 else
692 symname++;
693 #endif
694 if (is_crc) {
695 const char *e = is_vmlinux(mod->name) ?"":".ko";
696 warn("EXPORT symbol \"%s\" [%s%s] version generation failed, symbol will not be versioned.\n", symname + strlen(CRC_PFX), mod->name, e);
697 }
698 mod->unres = alloc_symbol(symname,
699 ELF_ST_BIND(sym->st_info) == STB_WEAK,
700 mod->unres);
701 break;
702 default:
703 /* All exported symbols */
704 if (strncmp(symname, KSYMTAB_PFX, strlen(KSYMTAB_PFX)) == 0) {
705 sym_add_exported(symname + strlen(KSYMTAB_PFX), mod,
706 export);
707 }
708 if (strcmp(symname, VMLINUX_SYMBOL_STR(init_module)) == 0)
709 mod->has_init = 1;
710 if (strcmp(symname, VMLINUX_SYMBOL_STR(cleanup_module)) == 0)
711 mod->has_cleanup = 1;
712 break;
713 }
714 }
715
716 /**
717 * Parse tag=value strings from .modinfo section
718 **/
next_string(char * string,unsigned long * secsize)719 static char *next_string(char *string, unsigned long *secsize)
720 {
721 /* Skip non-zero chars */
722 while (string[0]) {
723 string++;
724 if ((*secsize)-- <= 1)
725 return NULL;
726 }
727
728 /* Skip any zero padding. */
729 while (!string[0]) {
730 string++;
731 if ((*secsize)-- <= 1)
732 return NULL;
733 }
734 return string;
735 }
736
get_next_modinfo(void * modinfo,unsigned long modinfo_len,const char * tag,char * info)737 static char *get_next_modinfo(void *modinfo, unsigned long modinfo_len,
738 const char *tag, char *info)
739 {
740 char *p;
741 unsigned int taglen = strlen(tag);
742 unsigned long size = modinfo_len;
743
744 if (info) {
745 size -= info - (char *)modinfo;
746 modinfo = next_string(info, &size);
747 }
748
749 for (p = modinfo; p; p = next_string(p, &size)) {
750 if (strncmp(p, tag, taglen) == 0 && p[taglen] == '=')
751 return p + taglen + 1;
752 }
753 return NULL;
754 }
755
get_modinfo(void * modinfo,unsigned long modinfo_len,const char * tag)756 static char *get_modinfo(void *modinfo, unsigned long modinfo_len,
757 const char *tag)
758
759 {
760 return get_next_modinfo(modinfo, modinfo_len, tag, NULL);
761 }
762
763 /**
764 * Test if string s ends in string sub
765 * return 0 if match
766 **/
strrcmp(const char * s,const char * sub)767 static int strrcmp(const char *s, const char *sub)
768 {
769 int slen, sublen;
770
771 if (!s || !sub)
772 return 1;
773
774 slen = strlen(s);
775 sublen = strlen(sub);
776
777 if ((slen == 0) || (sublen == 0))
778 return 1;
779
780 if (sublen > slen)
781 return 1;
782
783 return memcmp(s + slen - sublen, sub, sublen);
784 }
785
sym_name(struct elf_info * elf,Elf_Sym * sym)786 static const char *sym_name(struct elf_info *elf, Elf_Sym *sym)
787 {
788 if (sym)
789 return elf->strtab + sym->st_name;
790 else
791 return "(unknown)";
792 }
793
794 /* The pattern is an array of simple patterns.
795 * "foo" will match an exact string equal to "foo"
796 * "*foo" will match a string that ends with "foo"
797 * "foo*" will match a string that begins with "foo"
798 * "*foo*" will match a string that contains "foo"
799 */
match(const char * sym,const char * const pat[])800 static int match(const char *sym, const char * const pat[])
801 {
802 const char *p;
803 while (*pat) {
804 p = *pat++;
805 const char *endp = p + strlen(p) - 1;
806
807 /* "*foo*" */
808 if (*p == '*' && *endp == '*') {
809 char *here, *bare = strndup(p + 1, strlen(p) - 2);
810
811 here = strstr(sym, bare);
812 free(bare);
813 if (here != NULL)
814 return 1;
815 }
816 /* "*foo" */
817 else if (*p == '*') {
818 if (strrcmp(sym, p + 1) == 0)
819 return 1;
820 }
821 /* "foo*" */
822 else if (*endp == '*') {
823 if (strncmp(sym, p, strlen(p) - 1) == 0)
824 return 1;
825 }
826 /* no wildcards */
827 else {
828 if (strcmp(p, sym) == 0)
829 return 1;
830 }
831 }
832 /* no match */
833 return 0;
834 }
835
836 /* sections that we do not want to do full section mismatch check on */
837 static const char *const section_white_list[] =
838 {
839 ".comment*",
840 ".debug*",
841 ".cranges", /* sh64 */
842 ".zdebug*", /* Compressed debug sections. */
843 ".GCC-command-line", /* mn10300 */
844 ".GCC.command.line", /* record-gcc-switches, non mn10300 */
845 ".mdebug*", /* alpha, score, mips etc. */
846 ".pdr", /* alpha, score, mips etc. */
847 ".stab*",
848 ".note*",
849 ".got*",
850 ".toc*",
851 ".xt.prop", /* xtensa */
852 ".xt.lit", /* xtensa */
853 ".arcextmap*", /* arc */
854 ".gnu.linkonce.arcext*", /* arc : modules */
855 ".cmem*", /* EZchip */
856 ".fmt_slot*", /* EZchip */
857 ".gnu.lto*",
858 ".discard.*",
859 NULL
860 };
861
862 /*
863 * This is used to find sections missing the SHF_ALLOC flag.
864 * The cause of this is often a section specified in assembler
865 * without "ax" / "aw".
866 */
check_section(const char * modname,struct elf_info * elf,Elf_Shdr * sechdr)867 static void check_section(const char *modname, struct elf_info *elf,
868 Elf_Shdr *sechdr)
869 {
870 const char *sec = sech_name(elf, sechdr);
871
872 if (sechdr->sh_type == SHT_PROGBITS &&
873 !(sechdr->sh_flags & SHF_ALLOC) &&
874 !match(sec, section_white_list)) {
875 warn("%s (%s): unexpected non-allocatable section.\n"
876 "Did you forget to use \"ax\"/\"aw\" in a .S file?\n"
877 "Note that for example <linux/init.h> contains\n"
878 "section definitions for use in .S files.\n\n",
879 modname, sec);
880 }
881 }
882
883
884
885 #define ALL_INIT_DATA_SECTIONS \
886 ".init.setup", ".init.rodata", ".meminit.rodata", \
887 ".init.data", ".meminit.data"
888 #define ALL_EXIT_DATA_SECTIONS \
889 ".exit.data", ".memexit.data"
890
891 #define ALL_INIT_TEXT_SECTIONS \
892 ".init.text", ".meminit.text"
893 #define ALL_EXIT_TEXT_SECTIONS \
894 ".exit.text", ".memexit.text"
895
896 #define ALL_PCI_INIT_SECTIONS \
897 ".pci_fixup_early", ".pci_fixup_header", ".pci_fixup_final", \
898 ".pci_fixup_enable", ".pci_fixup_resume", \
899 ".pci_fixup_resume_early", ".pci_fixup_suspend"
900
901 #define ALL_XXXINIT_SECTIONS MEM_INIT_SECTIONS
902 #define ALL_XXXEXIT_SECTIONS MEM_EXIT_SECTIONS
903
904 #define ALL_INIT_SECTIONS INIT_SECTIONS, ALL_XXXINIT_SECTIONS
905 #define ALL_EXIT_SECTIONS EXIT_SECTIONS, ALL_XXXEXIT_SECTIONS
906
907 #define DATA_SECTIONS ".data", ".data.rel"
908 #define TEXT_SECTIONS ".text", ".text.unlikely", ".sched.text", \
909 ".kprobes.text", ".cpuidle.text"
910 #define OTHER_TEXT_SECTIONS ".ref.text", ".head.text", ".spinlock.text", \
911 ".fixup", ".entry.text", ".exception.text", ".text.*", \
912 ".coldtext"
913
914 #define INIT_SECTIONS ".init.*"
915 #define MEM_INIT_SECTIONS ".meminit.*"
916
917 #define EXIT_SECTIONS ".exit.*"
918 #define MEM_EXIT_SECTIONS ".memexit.*"
919
920 #define ALL_TEXT_SECTIONS ALL_INIT_TEXT_SECTIONS, ALL_EXIT_TEXT_SECTIONS, \
921 TEXT_SECTIONS, OTHER_TEXT_SECTIONS
922
923 /* init data sections */
924 static const char *const init_data_sections[] =
925 { ALL_INIT_DATA_SECTIONS, NULL };
926
927 /* all init sections */
928 static const char *const init_sections[] = { ALL_INIT_SECTIONS, NULL };
929
930 /* All init and exit sections (code + data) */
931 static const char *const init_exit_sections[] =
932 {ALL_INIT_SECTIONS, ALL_EXIT_SECTIONS, NULL };
933
934 /* all text sections */
935 static const char *const text_sections[] = { ALL_TEXT_SECTIONS, NULL };
936
937 /* data section */
938 static const char *const data_sections[] = { DATA_SECTIONS, NULL };
939
940
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"
951
952 static const char *const head_sections[] = { ".head.text*", NULL };
953 static const char *const linker_symbols[] =
954 { "__init_begin", "_sinittext", "_einittext", NULL };
955 static const char *const optim_symbols[] = { "*.constprop.*", NULL };
956 static const char *const cfi_symbols[] = { "*.cfi", NULL };
957
958 enum mismatch {
959 TEXT_TO_ANY_INIT,
960 DATA_TO_ANY_INIT,
961 TEXT_TO_ANY_EXIT,
962 DATA_TO_ANY_EXIT,
963 XXXINIT_TO_SOME_INIT,
964 XXXEXIT_TO_SOME_EXIT,
965 ANY_INIT_TO_ANY_EXIT,
966 ANY_EXIT_TO_ANY_INIT,
967 EXPORT_TO_INIT_EXIT,
968 EXTABLE_TO_NON_TEXT,
969 };
970
971 /**
972 * Describe how to match sections on different criterias:
973 *
974 * @fromsec: Array of sections to be matched.
975 *
976 * @bad_tosec: Relocations applied to a section in @fromsec to a section in
977 * this array is forbidden (black-list). Can be empty.
978 *
979 * @good_tosec: Relocations applied to a section in @fromsec must be
980 * targetting sections in this array (white-list). Can be empty.
981 *
982 * @mismatch: Type of mismatch.
983 *
984 * @symbol_white_list: Do not match a relocation to a symbol in this list
985 * even if it is targetting a section in @bad_to_sec.
986 *
987 * @handler: Specific handler to call when a match is found. If NULL,
988 * default_mismatch_handler() will be called.
989 *
990 */
991 struct sectioncheck {
992 const char *fromsec[20];
993 const char *bad_tosec[20];
994 const char *good_tosec[20];
995 enum mismatch mismatch;
996 const char *symbol_white_list[20];
997 void (*handler)(const char *modname, struct elf_info *elf,
998 const struct sectioncheck* const mismatch,
999 Elf_Rela *r, Elf_Sym *sym, const char *fromsec);
1000
1001 };
1002
1003 static void extable_mismatch_handler(const char *modname, struct elf_info *elf,
1004 const struct sectioncheck* const mismatch,
1005 Elf_Rela *r, Elf_Sym *sym,
1006 const char *fromsec);
1007
1008 static const struct sectioncheck sectioncheck[] = {
1009 /* Do not reference init/exit code/data from
1010 * normal code and data
1011 */
1012 {
1013 .fromsec = { TEXT_SECTIONS, NULL },
1014 .bad_tosec = { ALL_INIT_SECTIONS, NULL },
1015 .mismatch = TEXT_TO_ANY_INIT,
1016 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1017 },
1018 {
1019 .fromsec = { DATA_SECTIONS, NULL },
1020 .bad_tosec = { ALL_XXXINIT_SECTIONS, NULL },
1021 .mismatch = DATA_TO_ANY_INIT,
1022 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1023 },
1024 {
1025 .fromsec = { DATA_SECTIONS, NULL },
1026 .bad_tosec = { INIT_SECTIONS, NULL },
1027 .mismatch = DATA_TO_ANY_INIT,
1028 .symbol_white_list = {
1029 "*_template", "*_timer", "*_sht", "*_ops",
1030 "*_probe", "*_probe_one", "*_console", NULL
1031 },
1032 },
1033 {
1034 .fromsec = { TEXT_SECTIONS, NULL },
1035 .bad_tosec = { ALL_EXIT_SECTIONS, NULL },
1036 .mismatch = TEXT_TO_ANY_EXIT,
1037 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1038 },
1039 {
1040 .fromsec = { DATA_SECTIONS, NULL },
1041 .bad_tosec = { ALL_EXIT_SECTIONS, NULL },
1042 .mismatch = DATA_TO_ANY_EXIT,
1043 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1044 },
1045 /* Do not reference init code/data from meminit code/data */
1046 {
1047 .fromsec = { ALL_XXXINIT_SECTIONS, NULL },
1048 .bad_tosec = { INIT_SECTIONS, NULL },
1049 .mismatch = XXXINIT_TO_SOME_INIT,
1050 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1051 },
1052 /* Do not reference exit code/data from memexit code/data */
1053 {
1054 .fromsec = { ALL_XXXEXIT_SECTIONS, NULL },
1055 .bad_tosec = { EXIT_SECTIONS, NULL },
1056 .mismatch = XXXEXIT_TO_SOME_EXIT,
1057 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1058 },
1059 /* Do not use exit code/data from init code */
1060 {
1061 .fromsec = { ALL_INIT_SECTIONS, NULL },
1062 .bad_tosec = { ALL_EXIT_SECTIONS, NULL },
1063 .mismatch = ANY_INIT_TO_ANY_EXIT,
1064 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1065 },
1066 /* Do not use init code/data from exit code */
1067 {
1068 .fromsec = { ALL_EXIT_SECTIONS, NULL },
1069 .bad_tosec = { ALL_INIT_SECTIONS, NULL },
1070 .mismatch = ANY_EXIT_TO_ANY_INIT,
1071 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1072 },
1073 {
1074 .fromsec = { ALL_PCI_INIT_SECTIONS, NULL },
1075 .bad_tosec = { INIT_SECTIONS, NULL },
1076 .mismatch = ANY_INIT_TO_ANY_EXIT,
1077 .symbol_white_list = { NULL },
1078 },
1079 /* Do not export init/exit functions or data */
1080 {
1081 .fromsec = { "__ksymtab*", NULL },
1082 .bad_tosec = { INIT_SECTIONS, EXIT_SECTIONS, NULL },
1083 .mismatch = EXPORT_TO_INIT_EXIT,
1084 .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
1085 },
1086 {
1087 .fromsec = { "__ex_table", NULL },
1088 /* If you're adding any new black-listed sections in here, consider
1089 * adding a special 'printer' for them in scripts/check_extable.
1090 */
1091 .bad_tosec = { ".altinstr_replacement", NULL },
1092 .good_tosec = {ALL_TEXT_SECTIONS , NULL},
1093 .mismatch = EXTABLE_TO_NON_TEXT,
1094 .handler = extable_mismatch_handler,
1095 }
1096 };
1097
section_mismatch(const char * fromsec,const char * tosec)1098 static const struct sectioncheck *section_mismatch(
1099 const char *fromsec, const char *tosec)
1100 {
1101 int i;
1102 int elems = sizeof(sectioncheck) / sizeof(struct sectioncheck);
1103 const struct sectioncheck *check = §ioncheck[0];
1104
1105 /*
1106 * The target section could be the SHT_NUL section when we're
1107 * handling relocations to un-resolved symbols, trying to match it
1108 * doesn't make much sense and causes build failures on parisc and
1109 * mn10300 architectures.
1110 */
1111 if (*tosec == '\0')
1112 return NULL;
1113
1114 for (i = 0; i < elems; i++) {
1115 if (match(fromsec, check->fromsec)) {
1116 if (check->bad_tosec[0] && match(tosec, check->bad_tosec))
1117 return check;
1118 if (check->good_tosec[0] && !match(tosec, check->good_tosec))
1119 return check;
1120 }
1121 check++;
1122 }
1123 return NULL;
1124 }
1125
1126 /**
1127 * Whitelist to allow certain references to pass with no warning.
1128 *
1129 * Pattern 1:
1130 * If a module parameter is declared __initdata and permissions=0
1131 * then this is legal despite the warning generated.
1132 * We cannot see value of permissions here, so just ignore
1133 * this pattern.
1134 * The pattern is identified by:
1135 * tosec = .init.data
1136 * fromsec = .data*
1137 * atsym =__param*
1138 *
1139 * Pattern 1a:
1140 * module_param_call() ops can refer to __init set function if permissions=0
1141 * The pattern is identified by:
1142 * tosec = .init.text
1143 * fromsec = .data*
1144 * atsym = __param_ops_*
1145 *
1146 * Pattern 2:
1147 * Many drivers utilise a *driver container with references to
1148 * add, remove, probe functions etc.
1149 * the pattern is identified by:
1150 * tosec = init or exit section
1151 * fromsec = data section
1152 * atsym = *driver, *_template, *_sht, *_ops, *_probe,
1153 * *probe_one, *_console, *_timer
1154 *
1155 * Pattern 3:
1156 * Whitelist all references from .head.text to any init section
1157 *
1158 * Pattern 4:
1159 * Some symbols belong to init section but still it is ok to reference
1160 * these from non-init sections as these symbols don't have any memory
1161 * allocated for them and symbol address and value are same. So even
1162 * if init section is freed, its ok to reference those symbols.
1163 * For ex. symbols marking the init section boundaries.
1164 * This pattern is identified by
1165 * refsymname = __init_begin, _sinittext, _einittext
1166 *
1167 * Pattern 5:
1168 * GCC may optimize static inlines when fed constant arg(s) resulting
1169 * in functions like cpumask_empty() -- generating an associated symbol
1170 * cpumask_empty.constprop.3 that appears in the audit. If the const that
1171 * is passed in comes from __init, like say nmi_ipi_mask, we get a
1172 * meaningless section warning. May need to add isra symbols too...
1173 * This pattern is identified by
1174 * tosec = init section
1175 * fromsec = text section
1176 * refsymname = *.constprop.*
1177 *
1178 * Pattern 6:
1179 * Hide section mismatch warnings for ELF local symbols. The goal
1180 * is to eliminate false positive modpost warnings caused by
1181 * compiler-generated ELF local symbol names such as ".LANCHOR1".
1182 * Autogenerated symbol names bypass modpost's "Pattern 2"
1183 * whitelisting, which relies on pattern-matching against symbol
1184 * names to work. (One situation where gcc can autogenerate ELF
1185 * local symbols is when "-fsection-anchors" is used.)
1186 *
1187 * Pattern 7:
1188 * With CONFIG_CFI_CLANG, clang appends .cfi to all indirectly called
1189 * functions and creates a function stub with the original name. This
1190 * stub is always placed in .text, even if the actual function with the
1191 * .cfi postfix is in .init.text or .exit.text.
1192 * This pattern is identified by
1193 * tosec = init or exit section
1194 * fromsec = text section
1195 * tosym = *.cfi
1196 *
1197 **/
secref_whitelist(const struct sectioncheck * mismatch,const char * fromsec,const char * fromsym,const char * tosec,const char * tosym)1198 static int secref_whitelist(const struct sectioncheck *mismatch,
1199 const char *fromsec, const char *fromsym,
1200 const char *tosec, const char *tosym)
1201 {
1202 /* Check for pattern 1 */
1203 if (match(tosec, init_data_sections) &&
1204 match(fromsec, data_sections) &&
1205 (strncmp(fromsym, "__param", strlen("__param")) == 0))
1206 return 0;
1207
1208 /* Check for pattern 1a */
1209 if (strcmp(tosec, ".init.text") == 0 &&
1210 match(fromsec, data_sections) &&
1211 (strncmp(fromsym, "__param_ops_", strlen("__param_ops_")) == 0))
1212 return 0;
1213
1214 /* Check for pattern 2 */
1215 if (match(tosec, init_exit_sections) &&
1216 match(fromsec, data_sections) &&
1217 match(fromsym, mismatch->symbol_white_list))
1218 return 0;
1219
1220 /* Check for pattern 3 */
1221 if (match(fromsec, head_sections) &&
1222 match(tosec, init_sections))
1223 return 0;
1224
1225 /* Check for pattern 4 */
1226 if (match(tosym, linker_symbols))
1227 return 0;
1228
1229 /* Check for pattern 5 */
1230 if (match(fromsec, text_sections) &&
1231 match(tosec, init_sections) &&
1232 match(fromsym, optim_symbols))
1233 return 0;
1234
1235 /* Check for pattern 6 */
1236 if (strstarts(fromsym, ".L"))
1237 return 0;
1238
1239 /* Check for pattern 7 */
1240 if (match(fromsec, text_sections) &&
1241 match(tosec, init_exit_sections) &&
1242 match(tosym, cfi_symbols))
1243 return 0;
1244
1245 return 1;
1246 }
1247
is_arm_mapping_symbol(const char * str)1248 static inline int is_arm_mapping_symbol(const char *str)
1249 {
1250 return str[0] == '$' && strchr("axtd", str[1])
1251 && (str[2] == '\0' || str[2] == '.');
1252 }
1253
1254 /*
1255 * If there's no name there, ignore it; likewise, ignore it if it's
1256 * one of the magic symbols emitted used by current ARM tools.
1257 *
1258 * Otherwise if find_symbols_between() returns those symbols, they'll
1259 * fail the whitelist tests and cause lots of false alarms ... fixable
1260 * only by merging __exit and __init sections into __text, bloating
1261 * the kernel (which is especially evil on embedded platforms).
1262 */
is_valid_name(struct elf_info * elf,Elf_Sym * sym)1263 static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym)
1264 {
1265 const char *name = elf->strtab + sym->st_name;
1266
1267 if (!name || !strlen(name))
1268 return 0;
1269 return !is_arm_mapping_symbol(name);
1270 }
1271
1272 /**
1273 * Find symbol based on relocation record info.
1274 * In some cases the symbol supplied is a valid symbol so
1275 * return refsym. If st_name != 0 we assume this is a valid symbol.
1276 * In other cases the symbol needs to be looked up in the symbol table
1277 * based on section and address.
1278 * **/
find_elf_symbol(struct elf_info * elf,Elf64_Sword addr,Elf_Sym * relsym)1279 static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr,
1280 Elf_Sym *relsym)
1281 {
1282 Elf_Sym *sym;
1283 Elf_Sym *near = NULL;
1284 Elf64_Sword distance = 20;
1285 Elf64_Sword d;
1286 unsigned int relsym_secindex;
1287
1288 if (relsym->st_name != 0)
1289 return relsym;
1290
1291 relsym_secindex = get_secindex(elf, relsym);
1292 for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
1293 if (get_secindex(elf, sym) != relsym_secindex)
1294 continue;
1295 if (ELF_ST_TYPE(sym->st_info) == STT_SECTION)
1296 continue;
1297 if (!is_valid_name(elf, sym))
1298 continue;
1299 if (sym->st_value == addr)
1300 return sym;
1301 /* Find a symbol nearby - addr are maybe negative */
1302 d = sym->st_value - addr;
1303 if (d < 0)
1304 d = addr - sym->st_value;
1305 if (d < distance) {
1306 distance = d;
1307 near = sym;
1308 }
1309 }
1310 /* We need a close match */
1311 if (distance < 20)
1312 return near;
1313 else
1314 return NULL;
1315 }
1316
1317 /*
1318 * Find symbols before or equal addr and after addr - in the section sec.
1319 * If we find two symbols with equal offset prefer one with a valid name.
1320 * The ELF format may have a better way to detect what type of symbol
1321 * it is, but this works for now.
1322 **/
find_elf_symbol2(struct elf_info * elf,Elf_Addr addr,const char * sec)1323 static Elf_Sym *find_elf_symbol2(struct elf_info *elf, Elf_Addr addr,
1324 const char *sec)
1325 {
1326 Elf_Sym *sym;
1327 Elf_Sym *near = NULL;
1328 Elf_Addr distance = ~0;
1329
1330 for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
1331 const char *symsec;
1332
1333 if (is_shndx_special(sym->st_shndx))
1334 continue;
1335 symsec = sec_name(elf, get_secindex(elf, sym));
1336 if (strcmp(symsec, sec) != 0)
1337 continue;
1338 if (!is_valid_name(elf, sym))
1339 continue;
1340 if (sym->st_value <= addr) {
1341 if ((addr - sym->st_value) < distance) {
1342 distance = addr - sym->st_value;
1343 near = sym;
1344 } else if ((addr - sym->st_value) == distance) {
1345 near = sym;
1346 }
1347 }
1348 }
1349 return near;
1350 }
1351
1352 /*
1353 * Convert a section name to the function/data attribute
1354 * .init.text => __init
1355 * .memexitconst => __memconst
1356 * etc.
1357 *
1358 * The memory of returned value has been allocated on a heap. The user of this
1359 * method should free it after usage.
1360 */
sec2annotation(const char * s)1361 static char *sec2annotation(const char *s)
1362 {
1363 if (match(s, init_exit_sections)) {
1364 char *p = NOFAIL(malloc(20));
1365 char *r = p;
1366
1367 *p++ = '_';
1368 *p++ = '_';
1369 if (*s == '.')
1370 s++;
1371 while (*s && *s != '.')
1372 *p++ = *s++;
1373 *p = '\0';
1374 if (*s == '.')
1375 s++;
1376 if (strstr(s, "rodata") != NULL)
1377 strcat(p, "const ");
1378 else if (strstr(s, "data") != NULL)
1379 strcat(p, "data ");
1380 else
1381 strcat(p, " ");
1382 return r;
1383 } else {
1384 return NOFAIL(strdup(""));
1385 }
1386 }
1387
is_function(Elf_Sym * sym)1388 static int is_function(Elf_Sym *sym)
1389 {
1390 if (sym)
1391 return ELF_ST_TYPE(sym->st_info) == STT_FUNC;
1392 else
1393 return -1;
1394 }
1395
print_section_list(const char * const list[20])1396 static void print_section_list(const char * const list[20])
1397 {
1398 const char *const *s = list;
1399
1400 while (*s) {
1401 fprintf(stderr, "%s", *s);
1402 s++;
1403 if (*s)
1404 fprintf(stderr, ", ");
1405 }
1406 fprintf(stderr, "\n");
1407 }
1408
get_pretty_name(int is_func,const char ** name,const char ** name_p)1409 static inline void get_pretty_name(int is_func, const char** name, const char** name_p)
1410 {
1411 switch (is_func) {
1412 case 0: *name = "variable"; *name_p = ""; break;
1413 case 1: *name = "function"; *name_p = "()"; break;
1414 default: *name = "(unknown reference)"; *name_p = ""; break;
1415 }
1416 }
1417
1418 /*
1419 * Print a warning about a section mismatch.
1420 * Try to find symbols near it so user can find it.
1421 * Check whitelist before warning - it may be a false positive.
1422 */
report_sec_mismatch(const char * modname,const struct sectioncheck * mismatch,const char * fromsec,unsigned long long fromaddr,const char * fromsym,int from_is_func,const char * tosec,const char * tosym,int to_is_func)1423 static void report_sec_mismatch(const char *modname,
1424 const struct sectioncheck *mismatch,
1425 const char *fromsec,
1426 unsigned long long fromaddr,
1427 const char *fromsym,
1428 int from_is_func,
1429 const char *tosec, const char *tosym,
1430 int to_is_func)
1431 {
1432 const char *from, *from_p;
1433 const char *to, *to_p;
1434 char *prl_from;
1435 char *prl_to;
1436
1437 sec_mismatch_count++;
1438 if (!sec_mismatch_verbose)
1439 return;
1440
1441 get_pretty_name(from_is_func, &from, &from_p);
1442 get_pretty_name(to_is_func, &to, &to_p);
1443
1444 warn("%s(%s+0x%llx): Section mismatch in reference from the %s %s%s "
1445 "to the %s %s:%s%s\n",
1446 modname, fromsec, fromaddr, from, fromsym, from_p, to, tosec,
1447 tosym, to_p);
1448
1449 switch (mismatch->mismatch) {
1450 case TEXT_TO_ANY_INIT:
1451 prl_from = sec2annotation(fromsec);
1452 prl_to = sec2annotation(tosec);
1453 fprintf(stderr,
1454 "The function %s%s() references\n"
1455 "the %s %s%s%s.\n"
1456 "This is often because %s lacks a %s\n"
1457 "annotation or the annotation of %s is wrong.\n",
1458 prl_from, fromsym,
1459 to, prl_to, tosym, to_p,
1460 fromsym, prl_to, tosym);
1461 free(prl_from);
1462 free(prl_to);
1463 break;
1464 case DATA_TO_ANY_INIT: {
1465 prl_to = sec2annotation(tosec);
1466 fprintf(stderr,
1467 "The variable %s references\n"
1468 "the %s %s%s%s\n"
1469 "If the reference is valid then annotate the\n"
1470 "variable with __init* or __refdata (see linux/init.h) "
1471 "or name the variable:\n",
1472 fromsym, to, prl_to, tosym, to_p);
1473 print_section_list(mismatch->symbol_white_list);
1474 free(prl_to);
1475 break;
1476 }
1477 case TEXT_TO_ANY_EXIT:
1478 prl_to = sec2annotation(tosec);
1479 fprintf(stderr,
1480 "The function %s() references a %s in an exit section.\n"
1481 "Often the %s %s%s has valid usage outside the exit section\n"
1482 "and the fix is to remove the %sannotation of %s.\n",
1483 fromsym, to, to, tosym, to_p, prl_to, tosym);
1484 free(prl_to);
1485 break;
1486 case DATA_TO_ANY_EXIT: {
1487 prl_to = sec2annotation(tosec);
1488 fprintf(stderr,
1489 "The variable %s references\n"
1490 "the %s %s%s%s\n"
1491 "If the reference is valid then annotate the\n"
1492 "variable with __exit* (see linux/init.h) or "
1493 "name the variable:\n",
1494 fromsym, to, prl_to, tosym, to_p);
1495 print_section_list(mismatch->symbol_white_list);
1496 free(prl_to);
1497 break;
1498 }
1499 case XXXINIT_TO_SOME_INIT:
1500 case XXXEXIT_TO_SOME_EXIT:
1501 prl_from = sec2annotation(fromsec);
1502 prl_to = sec2annotation(tosec);
1503 fprintf(stderr,
1504 "The %s %s%s%s references\n"
1505 "a %s %s%s%s.\n"
1506 "If %s is only used by %s then\n"
1507 "annotate %s with a matching annotation.\n",
1508 from, prl_from, fromsym, from_p,
1509 to, prl_to, tosym, to_p,
1510 tosym, fromsym, tosym);
1511 free(prl_from);
1512 free(prl_to);
1513 break;
1514 case ANY_INIT_TO_ANY_EXIT:
1515 prl_from = sec2annotation(fromsec);
1516 prl_to = sec2annotation(tosec);
1517 fprintf(stderr,
1518 "The %s %s%s%s references\n"
1519 "a %s %s%s%s.\n"
1520 "This is often seen when error handling "
1521 "in the init function\n"
1522 "uses functionality in the exit path.\n"
1523 "The fix is often to remove the %sannotation of\n"
1524 "%s%s so it may be used outside an exit section.\n",
1525 from, prl_from, fromsym, from_p,
1526 to, prl_to, tosym, to_p,
1527 prl_to, tosym, to_p);
1528 free(prl_from);
1529 free(prl_to);
1530 break;
1531 case ANY_EXIT_TO_ANY_INIT:
1532 prl_from = sec2annotation(fromsec);
1533 prl_to = sec2annotation(tosec);
1534 fprintf(stderr,
1535 "The %s %s%s%s references\n"
1536 "a %s %s%s%s.\n"
1537 "This is often seen when error handling "
1538 "in the exit function\n"
1539 "uses functionality in the init path.\n"
1540 "The fix is often to remove the %sannotation of\n"
1541 "%s%s so it may be used outside an init section.\n",
1542 from, prl_from, fromsym, from_p,
1543 to, prl_to, tosym, to_p,
1544 prl_to, tosym, to_p);
1545 free(prl_from);
1546 free(prl_to);
1547 break;
1548 case EXPORT_TO_INIT_EXIT:
1549 prl_to = sec2annotation(tosec);
1550 fprintf(stderr,
1551 "The symbol %s is exported and annotated %s\n"
1552 "Fix this by removing the %sannotation of %s "
1553 "or drop the export.\n",
1554 tosym, prl_to, prl_to, tosym);
1555 free(prl_to);
1556 break;
1557 case EXTABLE_TO_NON_TEXT:
1558 fatal("There's a special handler for this mismatch type, "
1559 "we should never get here.");
1560 break;
1561 }
1562 fprintf(stderr, "\n");
1563 }
1564
default_mismatch_handler(const char * modname,struct elf_info * elf,const struct sectioncheck * const mismatch,Elf_Rela * r,Elf_Sym * sym,const char * fromsec)1565 static void default_mismatch_handler(const char *modname, struct elf_info *elf,
1566 const struct sectioncheck* const mismatch,
1567 Elf_Rela *r, Elf_Sym *sym, const char *fromsec)
1568 {
1569 const char *tosec;
1570 Elf_Sym *to;
1571 Elf_Sym *from;
1572 const char *tosym;
1573 const char *fromsym;
1574
1575 from = find_elf_symbol2(elf, r->r_offset, fromsec);
1576 fromsym = sym_name(elf, from);
1577
1578 if (!strncmp(fromsym, "reference___initcall",
1579 sizeof("reference___initcall")-1))
1580 return;
1581
1582 tosec = sec_name(elf, get_secindex(elf, sym));
1583 to = find_elf_symbol(elf, r->r_addend, sym);
1584 tosym = sym_name(elf, to);
1585
1586 /* check whitelist - we may ignore it */
1587 if (secref_whitelist(mismatch,
1588 fromsec, fromsym, tosec, tosym)) {
1589 report_sec_mismatch(modname, mismatch,
1590 fromsec, r->r_offset, fromsym,
1591 is_function(from), tosec, tosym,
1592 is_function(to));
1593 }
1594 }
1595
is_executable_section(struct elf_info * elf,unsigned int section_index)1596 static int is_executable_section(struct elf_info* elf, unsigned int section_index)
1597 {
1598 if (section_index > elf->num_sections)
1599 fatal("section_index is outside elf->num_sections!\n");
1600
1601 return ((elf->sechdrs[section_index].sh_flags & SHF_EXECINSTR) == SHF_EXECINSTR);
1602 }
1603
1604 /*
1605 * We rely on a gross hack in section_rel[a]() calling find_extable_entry_size()
1606 * to know the sizeof(struct exception_table_entry) for the target architecture.
1607 */
1608 static unsigned int extable_entry_size = 0;
find_extable_entry_size(const char * const sec,const Elf_Rela * r)1609 static void find_extable_entry_size(const char* const sec, const Elf_Rela* r)
1610 {
1611 /*
1612 * If we're currently checking the second relocation within __ex_table,
1613 * that relocation offset tells us the offsetof(struct
1614 * exception_table_entry, fixup) which is equal to sizeof(struct
1615 * exception_table_entry) divided by two. We use that to our advantage
1616 * since there's no portable way to get that size as every architecture
1617 * seems to go with different sized types. Not pretty but better than
1618 * hard-coding the size for every architecture..
1619 */
1620 if (!extable_entry_size)
1621 extable_entry_size = r->r_offset * 2;
1622 }
1623
is_extable_fault_address(Elf_Rela * r)1624 static inline bool is_extable_fault_address(Elf_Rela *r)
1625 {
1626 /*
1627 * extable_entry_size is only discovered after we've handled the
1628 * _second_ relocation in __ex_table, so only abort when we're not
1629 * handling the first reloc and extable_entry_size is zero.
1630 */
1631 if (r->r_offset && extable_entry_size == 0)
1632 fatal("extable_entry size hasn't been discovered!\n");
1633
1634 return ((r->r_offset == 0) ||
1635 (r->r_offset % extable_entry_size == 0));
1636 }
1637
1638 #define is_second_extable_reloc(Start, Cur, Sec) \
1639 (((Cur) == (Start) + 1) && (strcmp("__ex_table", (Sec)) == 0))
1640
report_extable_warnings(const char * modname,struct elf_info * elf,const struct sectioncheck * const mismatch,Elf_Rela * r,Elf_Sym * sym,const char * fromsec,const char * tosec)1641 static void report_extable_warnings(const char* modname, struct elf_info* elf,
1642 const struct sectioncheck* const mismatch,
1643 Elf_Rela* r, Elf_Sym* sym,
1644 const char* fromsec, const char* tosec)
1645 {
1646 Elf_Sym* fromsym = find_elf_symbol2(elf, r->r_offset, fromsec);
1647 const char* fromsym_name = sym_name(elf, fromsym);
1648 Elf_Sym* tosym = find_elf_symbol(elf, r->r_addend, sym);
1649 const char* tosym_name = sym_name(elf, tosym);
1650 const char* from_pretty_name;
1651 const char* from_pretty_name_p;
1652 const char* to_pretty_name;
1653 const char* to_pretty_name_p;
1654
1655 get_pretty_name(is_function(fromsym),
1656 &from_pretty_name, &from_pretty_name_p);
1657 get_pretty_name(is_function(tosym),
1658 &to_pretty_name, &to_pretty_name_p);
1659
1660 warn("%s(%s+0x%lx): Section mismatch in reference"
1661 " from the %s %s%s to the %s %s:%s%s\n",
1662 modname, fromsec, (long)r->r_offset, from_pretty_name,
1663 fromsym_name, from_pretty_name_p,
1664 to_pretty_name, tosec, tosym_name, to_pretty_name_p);
1665
1666 if (!match(tosec, mismatch->bad_tosec) &&
1667 is_executable_section(elf, get_secindex(elf, sym)))
1668 fprintf(stderr,
1669 "The relocation at %s+0x%lx references\n"
1670 "section \"%s\" which is not in the list of\n"
1671 "authorized sections. If you're adding a new section\n"
1672 "and/or if this reference is valid, add \"%s\" to the\n"
1673 "list of authorized sections to jump to on fault.\n"
1674 "This can be achieved by adding \"%s\" to \n"
1675 "OTHER_TEXT_SECTIONS in scripts/mod/modpost.c.\n",
1676 fromsec, (long)r->r_offset, tosec, tosec, tosec);
1677 }
1678
extable_mismatch_handler(const char * modname,struct elf_info * elf,const struct sectioncheck * const mismatch,Elf_Rela * r,Elf_Sym * sym,const char * fromsec)1679 static void extable_mismatch_handler(const char* modname, struct elf_info *elf,
1680 const struct sectioncheck* const mismatch,
1681 Elf_Rela* r, Elf_Sym* sym,
1682 const char *fromsec)
1683 {
1684 const char* tosec = sec_name(elf, get_secindex(elf, sym));
1685
1686 sec_mismatch_count++;
1687
1688 if (sec_mismatch_verbose)
1689 report_extable_warnings(modname, elf, mismatch, r, sym,
1690 fromsec, tosec);
1691
1692 if (match(tosec, mismatch->bad_tosec))
1693 fatal("The relocation at %s+0x%lx references\n"
1694 "section \"%s\" which is black-listed.\n"
1695 "Something is seriously wrong and should be fixed.\n"
1696 "You might get more information about where this is\n"
1697 "coming from by using scripts/check_extable.sh %s\n",
1698 fromsec, (long)r->r_offset, tosec, modname);
1699 else if (!is_executable_section(elf, get_secindex(elf, sym))) {
1700 if (is_extable_fault_address(r))
1701 fatal("The relocation at %s+0x%lx references\n"
1702 "section \"%s\" which is not executable, IOW\n"
1703 "it is not possible for the kernel to fault\n"
1704 "at that address. Something is seriously wrong\n"
1705 "and should be fixed.\n",
1706 fromsec, (long)r->r_offset, tosec);
1707 else
1708 fatal("The relocation at %s+0x%lx references\n"
1709 "section \"%s\" which is not executable, IOW\n"
1710 "the kernel will fault if it ever tries to\n"
1711 "jump to it. Something is seriously wrong\n"
1712 "and should be fixed.\n",
1713 fromsec, (long)r->r_offset, tosec);
1714 }
1715 }
1716
check_section_mismatch(const char * modname,struct elf_info * elf,Elf_Rela * r,Elf_Sym * sym,const char * fromsec)1717 static void check_section_mismatch(const char *modname, struct elf_info *elf,
1718 Elf_Rela *r, Elf_Sym *sym, const char *fromsec)
1719 {
1720 const char *tosec = sec_name(elf, get_secindex(elf, sym));;
1721 const struct sectioncheck *mismatch = section_mismatch(fromsec, tosec);
1722
1723 if (mismatch) {
1724 if (mismatch->handler)
1725 mismatch->handler(modname, elf, mismatch,
1726 r, sym, fromsec);
1727 else
1728 default_mismatch_handler(modname, elf, mismatch,
1729 r, sym, fromsec);
1730 }
1731 }
1732
reloc_location(struct elf_info * elf,Elf_Shdr * sechdr,Elf_Rela * r)1733 static unsigned int *reloc_location(struct elf_info *elf,
1734 Elf_Shdr *sechdr, Elf_Rela *r)
1735 {
1736 Elf_Shdr *sechdrs = elf->sechdrs;
1737 int section = sechdr->sh_info;
1738
1739 return (void *)elf->hdr + sechdrs[section].sh_offset +
1740 r->r_offset;
1741 }
1742
addend_386_rel(struct elf_info * elf,Elf_Shdr * sechdr,Elf_Rela * r)1743 static int addend_386_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1744 {
1745 unsigned int r_typ = ELF_R_TYPE(r->r_info);
1746 unsigned int *location = reloc_location(elf, sechdr, r);
1747
1748 switch (r_typ) {
1749 case R_386_32:
1750 r->r_addend = TO_NATIVE(*location);
1751 break;
1752 case R_386_PC32:
1753 r->r_addend = TO_NATIVE(*location) + 4;
1754 /* For CONFIG_RELOCATABLE=y */
1755 if (elf->hdr->e_type == ET_EXEC)
1756 r->r_addend += r->r_offset;
1757 break;
1758 }
1759 return 0;
1760 }
1761
1762 #ifndef R_ARM_CALL
1763 #define R_ARM_CALL 28
1764 #endif
1765 #ifndef R_ARM_JUMP24
1766 #define R_ARM_JUMP24 29
1767 #endif
1768
1769 #ifndef R_ARM_THM_CALL
1770 #define R_ARM_THM_CALL 10
1771 #endif
1772 #ifndef R_ARM_THM_JUMP24
1773 #define R_ARM_THM_JUMP24 30
1774 #endif
1775 #ifndef R_ARM_THM_JUMP19
1776 #define R_ARM_THM_JUMP19 51
1777 #endif
1778
addend_arm_rel(struct elf_info * elf,Elf_Shdr * sechdr,Elf_Rela * r)1779 static int addend_arm_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1780 {
1781 unsigned int r_typ = ELF_R_TYPE(r->r_info);
1782
1783 switch (r_typ) {
1784 case R_ARM_ABS32:
1785 /* From ARM ABI: (S + A) | T */
1786 r->r_addend = (int)(long)
1787 (elf->symtab_start + ELF_R_SYM(r->r_info));
1788 break;
1789 case R_ARM_PC24:
1790 case R_ARM_CALL:
1791 case R_ARM_JUMP24:
1792 case R_ARM_THM_CALL:
1793 case R_ARM_THM_JUMP24:
1794 case R_ARM_THM_JUMP19:
1795 /* From ARM ABI: ((S + A) | T) - P */
1796 r->r_addend = (int)(long)(elf->hdr +
1797 sechdr->sh_offset +
1798 (r->r_offset - sechdr->sh_addr));
1799 break;
1800 default:
1801 return 1;
1802 }
1803 return 0;
1804 }
1805
addend_mips_rel(struct elf_info * elf,Elf_Shdr * sechdr,Elf_Rela * r)1806 static int addend_mips_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
1807 {
1808 unsigned int r_typ = ELF_R_TYPE(r->r_info);
1809 unsigned int *location = reloc_location(elf, sechdr, r);
1810 unsigned int inst;
1811
1812 if (r_typ == R_MIPS_HI16)
1813 return 1; /* skip this */
1814 inst = TO_NATIVE(*location);
1815 switch (r_typ) {
1816 case R_MIPS_LO16:
1817 r->r_addend = inst & 0xffff;
1818 break;
1819 case R_MIPS_26:
1820 r->r_addend = (inst & 0x03ffffff) << 2;
1821 break;
1822 case R_MIPS_32:
1823 r->r_addend = inst;
1824 break;
1825 }
1826 return 0;
1827 }
1828
section_rela(const char * modname,struct elf_info * elf,Elf_Shdr * sechdr)1829 static void section_rela(const char *modname, struct elf_info *elf,
1830 Elf_Shdr *sechdr)
1831 {
1832 Elf_Sym *sym;
1833 Elf_Rela *rela;
1834 Elf_Rela r;
1835 unsigned int r_sym;
1836 const char *fromsec;
1837
1838 Elf_Rela *start = (void *)elf->hdr + sechdr->sh_offset;
1839 Elf_Rela *stop = (void *)start + sechdr->sh_size;
1840
1841 fromsec = sech_name(elf, sechdr);
1842 fromsec += strlen(".rela");
1843 /* if from section (name) is know good then skip it */
1844 if (match(fromsec, section_white_list))
1845 return;
1846
1847 for (rela = start; rela < stop; rela++) {
1848 r.r_offset = TO_NATIVE(rela->r_offset);
1849 #if KERNEL_ELFCLASS == ELFCLASS64
1850 if (elf->hdr->e_machine == EM_MIPS) {
1851 unsigned int r_typ;
1852 r_sym = ELF64_MIPS_R_SYM(rela->r_info);
1853 r_sym = TO_NATIVE(r_sym);
1854 r_typ = ELF64_MIPS_R_TYPE(rela->r_info);
1855 r.r_info = ELF64_R_INFO(r_sym, r_typ);
1856 } else {
1857 r.r_info = TO_NATIVE(rela->r_info);
1858 r_sym = ELF_R_SYM(r.r_info);
1859 }
1860 #else
1861 r.r_info = TO_NATIVE(rela->r_info);
1862 r_sym = ELF_R_SYM(r.r_info);
1863 #endif
1864 r.r_addend = TO_NATIVE(rela->r_addend);
1865 sym = elf->symtab_start + r_sym;
1866 /* Skip special sections */
1867 if (is_shndx_special(sym->st_shndx))
1868 continue;
1869 if (is_second_extable_reloc(start, rela, fromsec))
1870 find_extable_entry_size(fromsec, &r);
1871 check_section_mismatch(modname, elf, &r, sym, fromsec);
1872 }
1873 }
1874
section_rel(const char * modname,struct elf_info * elf,Elf_Shdr * sechdr)1875 static void section_rel(const char *modname, struct elf_info *elf,
1876 Elf_Shdr *sechdr)
1877 {
1878 Elf_Sym *sym;
1879 Elf_Rel *rel;
1880 Elf_Rela r;
1881 unsigned int r_sym;
1882 const char *fromsec;
1883
1884 Elf_Rel *start = (void *)elf->hdr + sechdr->sh_offset;
1885 Elf_Rel *stop = (void *)start + sechdr->sh_size;
1886
1887 fromsec = sech_name(elf, sechdr);
1888 fromsec += strlen(".rel");
1889 /* if from section (name) is know good then skip it */
1890 if (match(fromsec, section_white_list))
1891 return;
1892
1893 for (rel = start; rel < stop; rel++) {
1894 r.r_offset = TO_NATIVE(rel->r_offset);
1895 #if KERNEL_ELFCLASS == ELFCLASS64
1896 if (elf->hdr->e_machine == EM_MIPS) {
1897 unsigned int r_typ;
1898 r_sym = ELF64_MIPS_R_SYM(rel->r_info);
1899 r_sym = TO_NATIVE(r_sym);
1900 r_typ = ELF64_MIPS_R_TYPE(rel->r_info);
1901 r.r_info = ELF64_R_INFO(r_sym, r_typ);
1902 } else {
1903 r.r_info = TO_NATIVE(rel->r_info);
1904 r_sym = ELF_R_SYM(r.r_info);
1905 }
1906 #else
1907 r.r_info = TO_NATIVE(rel->r_info);
1908 r_sym = ELF_R_SYM(r.r_info);
1909 #endif
1910 r.r_addend = 0;
1911 switch (elf->hdr->e_machine) {
1912 case EM_386:
1913 if (addend_386_rel(elf, sechdr, &r))
1914 continue;
1915 break;
1916 case EM_ARM:
1917 if (addend_arm_rel(elf, sechdr, &r))
1918 continue;
1919 break;
1920 case EM_MIPS:
1921 if (addend_mips_rel(elf, sechdr, &r))
1922 continue;
1923 break;
1924 }
1925 sym = elf->symtab_start + r_sym;
1926 /* Skip special sections */
1927 if (is_shndx_special(sym->st_shndx))
1928 continue;
1929 if (is_second_extable_reloc(start, rel, fromsec))
1930 find_extable_entry_size(fromsec, &r);
1931 check_section_mismatch(modname, elf, &r, sym, fromsec);
1932 }
1933 }
1934
1935 /**
1936 * A module includes a number of sections that are discarded
1937 * either when loaded or when used as built-in.
1938 * For loaded modules all functions marked __init and all data
1939 * marked __initdata will be discarded when the module has been initialized.
1940 * Likewise for modules used built-in the sections marked __exit
1941 * are discarded because __exit marked function are supposed to be called
1942 * only when a module is unloaded which never happens for built-in modules.
1943 * The check_sec_ref() function traverses all relocation records
1944 * to find all references to a section that reference a section that will
1945 * be discarded and warns about it.
1946 **/
check_sec_ref(struct module * mod,const char * modname,struct elf_info * elf)1947 static void check_sec_ref(struct module *mod, const char *modname,
1948 struct elf_info *elf)
1949 {
1950 int i;
1951 Elf_Shdr *sechdrs = elf->sechdrs;
1952
1953 /* Walk through all sections */
1954 for (i = 0; i < elf->num_sections; i++) {
1955 check_section(modname, elf, &elf->sechdrs[i]);
1956 /* We want to process only relocation sections and not .init */
1957 if (sechdrs[i].sh_type == SHT_RELA)
1958 section_rela(modname, elf, &elf->sechdrs[i]);
1959 else if (sechdrs[i].sh_type == SHT_REL)
1960 section_rel(modname, elf, &elf->sechdrs[i]);
1961 }
1962 }
1963
remove_dot(char * s)1964 static char *remove_dot(char *s)
1965 {
1966 size_t n = strcspn(s, ".");
1967
1968 if (n && s[n]) {
1969 size_t m = strspn(s + n + 1, "0123456789");
1970 if (m && (s[n + m] == '.' || s[n + m] == 0))
1971 s[n] = 0;
1972 }
1973 return s;
1974 }
1975
read_symbols(char * modname)1976 static void read_symbols(char *modname)
1977 {
1978 const char *symname;
1979 char *version;
1980 char *license;
1981 struct module *mod;
1982 struct elf_info info = { };
1983 Elf_Sym *sym;
1984
1985 if (!parse_elf(&info, modname))
1986 return;
1987
1988 mod = new_module(modname);
1989
1990 /* When there's no vmlinux, don't print warnings about
1991 * unresolved symbols (since there'll be too many ;) */
1992 if (is_vmlinux(modname)) {
1993 have_vmlinux = 1;
1994 mod->skip = 1;
1995 }
1996
1997 license = get_modinfo(info.modinfo, info.modinfo_len, "license");
1998 if (info.modinfo && !license && !is_vmlinux(modname))
1999 warn("modpost: missing MODULE_LICENSE() in %s\n"
2000 "see include/linux/module.h for "
2001 "more information\n", modname);
2002 while (license) {
2003 if (license_is_gpl_compatible(license))
2004 mod->gpl_compatible = 1;
2005 else {
2006 mod->gpl_compatible = 0;
2007 break;
2008 }
2009 license = get_next_modinfo(info.modinfo, info.modinfo_len,
2010 "license", license);
2011 }
2012
2013 for (sym = info.symtab_start; sym < info.symtab_stop; sym++) {
2014 symname = remove_dot(info.strtab + sym->st_name);
2015
2016 handle_modversions(mod, &info, sym, symname);
2017 handle_moddevtable(mod, &info, sym, symname);
2018 }
2019 if (!is_vmlinux(modname) ||
2020 (is_vmlinux(modname) && vmlinux_section_warnings))
2021 check_sec_ref(mod, modname, &info);
2022
2023 version = get_modinfo(info.modinfo, info.modinfo_len, "version");
2024 if (version)
2025 maybe_frob_rcs_version(modname, version, info.modinfo,
2026 version - (char *)info.hdr);
2027 if (version || (all_versions && !is_vmlinux(modname)))
2028 get_src_version(modname, mod->srcversion,
2029 sizeof(mod->srcversion)-1);
2030
2031 parse_elf_finish(&info);
2032
2033 /* Our trick to get versioning for module struct etc. - it's
2034 * never passed as an argument to an exported function, so
2035 * the automatic versioning doesn't pick it up, but it's really
2036 * important anyhow */
2037 if (modversions)
2038 mod->unres = alloc_symbol("module_layout", 0, mod->unres);
2039 }
2040
read_symbols_from_files(const char * filename)2041 static void read_symbols_from_files(const char *filename)
2042 {
2043 FILE *in = stdin;
2044 char fname[PATH_MAX];
2045
2046 if (strcmp(filename, "-") != 0) {
2047 in = fopen(filename, "r");
2048 if (!in)
2049 fatal("Can't open filenames file %s: %m", filename);
2050 }
2051
2052 while (fgets(fname, PATH_MAX, in) != NULL) {
2053 if (strends(fname, "\n"))
2054 fname[strlen(fname)-1] = '\0';
2055 read_symbols(fname);
2056 }
2057
2058 if (in != stdin)
2059 fclose(in);
2060 }
2061
2062 #define SZ 500
2063
2064 /* We first write the generated file into memory using the
2065 * following helper, then compare to the file on disk and
2066 * only update the later if anything changed */
2067
buf_printf(struct buffer * buf,const char * fmt,...)2068 void __attribute__((format(printf, 2, 3))) buf_printf(struct buffer *buf,
2069 const char *fmt, ...)
2070 {
2071 char tmp[SZ];
2072 int len;
2073 va_list ap;
2074
2075 va_start(ap, fmt);
2076 len = vsnprintf(tmp, SZ, fmt, ap);
2077 buf_write(buf, tmp, len);
2078 va_end(ap);
2079 }
2080
buf_write(struct buffer * buf,const char * s,int len)2081 void buf_write(struct buffer *buf, const char *s, int len)
2082 {
2083 if (buf->size - buf->pos < len) {
2084 buf->size += len + SZ;
2085 buf->p = NOFAIL(realloc(buf->p, buf->size));
2086 }
2087 strncpy(buf->p + buf->pos, s, len);
2088 buf->pos += len;
2089 }
2090
check_for_gpl_usage(enum export exp,const char * m,const char * s)2091 static void check_for_gpl_usage(enum export exp, const char *m, const char *s)
2092 {
2093 const char *e = is_vmlinux(m) ?"":".ko";
2094
2095 switch (exp) {
2096 case export_gpl:
2097 fatal("modpost: GPL-incompatible module %s%s "
2098 "uses GPL-only symbol '%s'\n", m, e, s);
2099 break;
2100 case export_unused_gpl:
2101 fatal("modpost: GPL-incompatible module %s%s "
2102 "uses GPL-only symbol marked UNUSED '%s'\n", m, e, s);
2103 break;
2104 case export_gpl_future:
2105 warn("modpost: GPL-incompatible module %s%s "
2106 "uses future GPL-only symbol '%s'\n", m, e, s);
2107 break;
2108 case export_plain:
2109 case export_unused:
2110 case export_unknown:
2111 /* ignore */
2112 break;
2113 }
2114 }
2115
check_for_unused(enum export exp,const char * m,const char * s)2116 static void check_for_unused(enum export exp, const char *m, const char *s)
2117 {
2118 const char *e = is_vmlinux(m) ?"":".ko";
2119
2120 switch (exp) {
2121 case export_unused:
2122 case export_unused_gpl:
2123 warn("modpost: module %s%s "
2124 "uses symbol '%s' marked UNUSED\n", m, e, s);
2125 break;
2126 default:
2127 /* ignore */
2128 break;
2129 }
2130 }
2131
check_exports(struct module * mod)2132 static void check_exports(struct module *mod)
2133 {
2134 struct symbol *s, *exp;
2135
2136 for (s = mod->unres; s; s = s->next) {
2137 const char *basename;
2138 exp = find_symbol(s->name);
2139 if (!exp || exp->module == mod)
2140 continue;
2141 basename = strrchr(mod->name, '/');
2142 if (basename)
2143 basename++;
2144 else
2145 basename = mod->name;
2146 if (!mod->gpl_compatible)
2147 check_for_gpl_usage(exp->export, basename, exp->name);
2148 check_for_unused(exp->export, basename, exp->name);
2149 }
2150 }
2151
check_modname_len(struct module * mod)2152 static int check_modname_len(struct module *mod)
2153 {
2154 const char *mod_name;
2155
2156 mod_name = strrchr(mod->name, '/');
2157 if (mod_name == NULL)
2158 mod_name = mod->name;
2159 else
2160 mod_name++;
2161 if (strlen(mod_name) >= MODULE_NAME_LEN) {
2162 merror("module name is too long [%s.ko]\n", mod->name);
2163 return 1;
2164 }
2165
2166 return 0;
2167 }
2168
2169 /**
2170 * Header for the generated file
2171 **/
add_header(struct buffer * b,struct module * mod)2172 static void add_header(struct buffer *b, struct module *mod)
2173 {
2174 buf_printf(b, "#include <linux/module.h>\n");
2175 buf_printf(b, "#include <linux/vermagic.h>\n");
2176 buf_printf(b, "#include <linux/compiler.h>\n");
2177 buf_printf(b, "\n");
2178 buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n");
2179 buf_printf(b, "MODULE_INFO(name, KBUILD_MODNAME);\n");
2180 buf_printf(b, "\n");
2181 buf_printf(b, "__visible struct module __this_module\n");
2182 buf_printf(b, "__attribute__((section(\".gnu.linkonce.this_module\"))) = {\n");
2183 buf_printf(b, "\t.name = KBUILD_MODNAME,\n");
2184 if (mod->has_init)
2185 buf_printf(b, "\t.init = init_module,\n");
2186 if (mod->has_cleanup)
2187 buf_printf(b, "#ifdef CONFIG_MODULE_UNLOAD\n"
2188 "\t.exit = cleanup_module,\n"
2189 "#endif\n");
2190 buf_printf(b, "\t.arch = MODULE_ARCH_INIT,\n");
2191 buf_printf(b, "};\n");
2192 }
2193
add_intree_flag(struct buffer * b,int is_intree)2194 static void add_intree_flag(struct buffer *b, int is_intree)
2195 {
2196 if (is_intree)
2197 buf_printf(b, "\nMODULE_INFO(intree, \"Y\");\n");
2198 }
2199
2200 /* Cannot check for assembler */
add_retpoline(struct buffer * b)2201 static void add_retpoline(struct buffer *b)
2202 {
2203 buf_printf(b, "\n#ifdef CONFIG_RETPOLINE\n");
2204 buf_printf(b, "MODULE_INFO(retpoline, \"Y\");\n");
2205 buf_printf(b, "#endif\n");
2206 }
2207
add_staging_flag(struct buffer * b,const char * name)2208 static void add_staging_flag(struct buffer *b, const char *name)
2209 {
2210 static const char *staging_dir = "drivers/staging";
2211
2212 if (strncmp(staging_dir, name, strlen(staging_dir)) == 0)
2213 buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n");
2214 }
2215
2216 /**
2217 * Record CRCs for unresolved symbols
2218 **/
add_versions(struct buffer * b,struct module * mod)2219 static int add_versions(struct buffer *b, struct module *mod)
2220 {
2221 struct symbol *s, *exp;
2222 int err = 0;
2223
2224 for (s = mod->unres; s; s = s->next) {
2225 exp = find_symbol(s->name);
2226 if (!exp || exp->module == mod) {
2227 if (have_vmlinux && !s->weak) {
2228 if (warn_unresolved) {
2229 warn("\"%s\" [%s.ko] undefined!\n",
2230 s->name, mod->name);
2231 } else {
2232 merror("\"%s\" [%s.ko] undefined!\n",
2233 s->name, mod->name);
2234 err = 1;
2235 }
2236 }
2237 continue;
2238 }
2239 s->module = exp->module;
2240 s->crc_valid = exp->crc_valid;
2241 s->crc = exp->crc;
2242 }
2243
2244 if (!modversions)
2245 return err;
2246
2247 buf_printf(b, "\n");
2248 buf_printf(b, "static const struct modversion_info ____versions[]\n");
2249 buf_printf(b, "__used\n");
2250 buf_printf(b, "__attribute__((section(\"__versions\"))) = {\n");
2251
2252 for (s = mod->unres; s; s = s->next) {
2253 if (!s->module)
2254 continue;
2255 if (!s->crc_valid) {
2256 warn("\"%s\" [%s.ko] has no CRC!\n",
2257 s->name, mod->name);
2258 continue;
2259 }
2260 if (strlen(s->name) >= MODULE_NAME_LEN) {
2261 merror("too long symbol \"%s\" [%s.ko]\n",
2262 s->name, mod->name);
2263 err = 1;
2264 break;
2265 }
2266 buf_printf(b, "\t{ %#8x, __VMLINUX_SYMBOL_STR(%s) },\n",
2267 s->crc, s->name);
2268 }
2269
2270 buf_printf(b, "};\n");
2271
2272 return err;
2273 }
2274
add_depends(struct buffer * b,struct module * mod,struct module * modules)2275 static void add_depends(struct buffer *b, struct module *mod,
2276 struct module *modules)
2277 {
2278 struct symbol *s;
2279 struct module *m;
2280 int first = 1;
2281
2282 for (m = modules; m; m = m->next)
2283 m->seen = is_vmlinux(m->name);
2284
2285 buf_printf(b, "\n");
2286 buf_printf(b, "static const char __module_depends[]\n");
2287 buf_printf(b, "__used\n");
2288 buf_printf(b, "__attribute__((section(\".modinfo\"))) =\n");
2289 buf_printf(b, "\"depends=");
2290 for (s = mod->unres; s; s = s->next) {
2291 const char *p;
2292 if (!s->module)
2293 continue;
2294
2295 if (s->module->seen)
2296 continue;
2297
2298 s->module->seen = 1;
2299 p = strrchr(s->module->name, '/');
2300 if (p)
2301 p++;
2302 else
2303 p = s->module->name;
2304 buf_printf(b, "%s%s", first ? "" : ",", p);
2305 first = 0;
2306 }
2307 buf_printf(b, "\";\n");
2308 }
2309
add_srcversion(struct buffer * b,struct module * mod)2310 static void add_srcversion(struct buffer *b, struct module *mod)
2311 {
2312 if (mod->srcversion[0]) {
2313 buf_printf(b, "\n");
2314 buf_printf(b, "MODULE_INFO(srcversion, \"%s\");\n",
2315 mod->srcversion);
2316 }
2317 }
2318
write_if_changed(struct buffer * b,const char * fname)2319 static void write_if_changed(struct buffer *b, const char *fname)
2320 {
2321 char *tmp;
2322 FILE *file;
2323 struct stat st;
2324
2325 file = fopen(fname, "r");
2326 if (!file)
2327 goto write;
2328
2329 if (fstat(fileno(file), &st) < 0)
2330 goto close_write;
2331
2332 if (st.st_size != b->pos)
2333 goto close_write;
2334
2335 tmp = NOFAIL(malloc(b->pos));
2336 if (fread(tmp, 1, b->pos, file) != b->pos)
2337 goto free_write;
2338
2339 if (memcmp(tmp, b->p, b->pos) != 0)
2340 goto free_write;
2341
2342 free(tmp);
2343 fclose(file);
2344 return;
2345
2346 free_write:
2347 free(tmp);
2348 close_write:
2349 fclose(file);
2350 write:
2351 file = fopen(fname, "w");
2352 if (!file) {
2353 perror(fname);
2354 exit(1);
2355 }
2356 if (fwrite(b->p, 1, b->pos, file) != b->pos) {
2357 perror(fname);
2358 exit(1);
2359 }
2360 fclose(file);
2361 }
2362
2363 /* parse Module.symvers file. line format:
2364 * 0x12345678<tab>symbol<tab>module[[<tab>export]<tab>something]
2365 **/
read_dump(const char * fname,unsigned int kernel)2366 static void read_dump(const char *fname, unsigned int kernel)
2367 {
2368 unsigned long size, pos = 0;
2369 void *file = grab_file(fname, &size);
2370 char *line;
2371
2372 if (!file)
2373 /* No symbol versions, silently ignore */
2374 return;
2375
2376 while ((line = get_next_line(&pos, file, size))) {
2377 char *symname, *modname, *d, *export, *end;
2378 unsigned int crc;
2379 struct module *mod;
2380 struct symbol *s;
2381
2382 if (!(symname = strchr(line, '\t')))
2383 goto fail;
2384 *symname++ = '\0';
2385 if (!(modname = strchr(symname, '\t')))
2386 goto fail;
2387 *modname++ = '\0';
2388 if ((export = strchr(modname, '\t')) != NULL)
2389 *export++ = '\0';
2390 if (export && ((end = strchr(export, '\t')) != NULL))
2391 *end = '\0';
2392 crc = strtoul(line, &d, 16);
2393 if (*symname == '\0' || *modname == '\0' || *d != '\0')
2394 goto fail;
2395 mod = find_module(modname);
2396 if (!mod) {
2397 if (is_vmlinux(modname))
2398 have_vmlinux = 1;
2399 mod = new_module(modname);
2400 mod->skip = 1;
2401 }
2402 s = sym_add_exported(symname, mod, export_no(export));
2403 s->kernel = kernel;
2404 s->preloaded = 1;
2405 sym_update_crc(symname, mod, crc, export_no(export));
2406 }
2407 release_file(file, size);
2408 return;
2409 fail:
2410 release_file(file, size);
2411 fatal("parse error in symbol dump file\n");
2412 }
2413
2414 /* For normal builds always dump all symbols.
2415 * For external modules only dump symbols
2416 * that are not read from kernel Module.symvers.
2417 **/
dump_sym(struct symbol * sym)2418 static int dump_sym(struct symbol *sym)
2419 {
2420 if (!external_module)
2421 return 1;
2422 if (sym->vmlinux || sym->kernel)
2423 return 0;
2424 return 1;
2425 }
2426
write_dump(const char * fname)2427 static void write_dump(const char *fname)
2428 {
2429 struct buffer buf = { };
2430 struct symbol *symbol;
2431 int n;
2432
2433 for (n = 0; n < SYMBOL_HASH_SIZE ; n++) {
2434 symbol = symbolhash[n];
2435 while (symbol) {
2436 if (dump_sym(symbol))
2437 buf_printf(&buf, "0x%08x\t%s\t%s\t%s\n",
2438 symbol->crc, symbol->name,
2439 symbol->module->name,
2440 export_str(symbol->export));
2441 symbol = symbol->next;
2442 }
2443 }
2444 write_if_changed(&buf, fname);
2445 free(buf.p);
2446 }
2447
2448 struct ext_sym_list {
2449 struct ext_sym_list *next;
2450 const char *file;
2451 };
2452
main(int argc,char ** argv)2453 int main(int argc, char **argv)
2454 {
2455 struct module *mod;
2456 struct buffer buf = { };
2457 char *kernel_read = NULL, *module_read = NULL;
2458 char *dump_write = NULL, *files_source = NULL;
2459 int opt;
2460 int err;
2461 struct ext_sym_list *extsym_iter;
2462 struct ext_sym_list *extsym_start = NULL;
2463
2464 while ((opt = getopt(argc, argv, "i:I:e:mnsST:o:awM:K:E")) != -1) {
2465 switch (opt) {
2466 case 'i':
2467 kernel_read = optarg;
2468 break;
2469 case 'I':
2470 module_read = optarg;
2471 external_module = 1;
2472 break;
2473 case 'e':
2474 external_module = 1;
2475 extsym_iter =
2476 NOFAIL(malloc(sizeof(*extsym_iter)));
2477 extsym_iter->next = extsym_start;
2478 extsym_iter->file = optarg;
2479 extsym_start = extsym_iter;
2480 break;
2481 case 'm':
2482 modversions = 1;
2483 break;
2484 case 'n':
2485 ignore_missing_files = 1;
2486 break;
2487 case 'o':
2488 dump_write = optarg;
2489 break;
2490 case 'a':
2491 all_versions = 1;
2492 break;
2493 case 's':
2494 vmlinux_section_warnings = 0;
2495 break;
2496 case 'S':
2497 sec_mismatch_verbose = 0;
2498 break;
2499 case 'T':
2500 files_source = optarg;
2501 break;
2502 case 'w':
2503 warn_unresolved = 1;
2504 break;
2505 case 'E':
2506 sec_mismatch_fatal = 1;
2507 break;
2508 default:
2509 exit(1);
2510 }
2511 }
2512
2513 if (kernel_read)
2514 read_dump(kernel_read, 1);
2515 if (module_read)
2516 read_dump(module_read, 0);
2517 while (extsym_start) {
2518 read_dump(extsym_start->file, 0);
2519 extsym_iter = extsym_start->next;
2520 free(extsym_start);
2521 extsym_start = extsym_iter;
2522 }
2523
2524 while (optind < argc)
2525 read_symbols(argv[optind++]);
2526
2527 if (files_source)
2528 read_symbols_from_files(files_source);
2529
2530 for (mod = modules; mod; mod = mod->next) {
2531 if (mod->skip)
2532 continue;
2533 check_exports(mod);
2534 }
2535
2536 err = 0;
2537
2538 for (mod = modules; mod; mod = mod->next) {
2539 char fname[PATH_MAX];
2540
2541 if (mod->skip)
2542 continue;
2543
2544 buf.pos = 0;
2545
2546 err |= check_modname_len(mod);
2547 add_header(&buf, mod);
2548 add_intree_flag(&buf, !external_module);
2549 add_retpoline(&buf);
2550 add_staging_flag(&buf, mod->name);
2551 err |= add_versions(&buf, mod);
2552 add_depends(&buf, mod, modules);
2553 add_moddevtable(&buf, mod);
2554 add_srcversion(&buf, mod);
2555
2556 sprintf(fname, "%s.mod.c", mod->name);
2557 write_if_changed(&buf, fname);
2558 }
2559 if (dump_write)
2560 write_dump(dump_write);
2561 if (sec_mismatch_count) {
2562 if (!sec_mismatch_verbose) {
2563 warn("modpost: Found %d section mismatch(es).\n"
2564 "To see full details build your kernel with:\n"
2565 "'make CONFIG_DEBUG_SECTION_MISMATCH=y'\n",
2566 sec_mismatch_count);
2567 }
2568 if (sec_mismatch_fatal) {
2569 fatal("modpost: Section mismatches detected.\n"
2570 "Set CONFIG_SECTION_MISMATCH_WARN_ONLY=y to allow them.\n");
2571 }
2572 }
2573 free(buf.p);
2574
2575 return err;
2576 }
2577