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