]> Git Repo - J-linux.git/blob - scripts/mod/modpost.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / scripts / mod / modpost.c
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 <elf.h>
16 #include <fnmatch.h>
17 #include <stdio.h>
18 #include <ctype.h>
19 #include <string.h>
20 #include <limits.h>
21 #include <stdbool.h>
22 #include <errno.h>
23
24 #include <hash.h>
25 #include <hashtable.h>
26 #include <list.h>
27 #include <xalloc.h>
28 #include "modpost.h"
29 #include "../../include/linux/license.h"
30
31 static bool module_enabled;
32 /* Are we using CONFIG_MODVERSIONS? */
33 static bool modversions;
34 /* Is CONFIG_MODULE_SRCVERSION_ALL set? */
35 static bool all_versions;
36 /* If we are modposting external module set to 1 */
37 static bool external_module;
38 /* Only warn about unresolved symbols */
39 static bool warn_unresolved;
40
41 static int sec_mismatch_count;
42 static bool sec_mismatch_warn_only = true;
43 /* Trim EXPORT_SYMBOLs that are unused by in-tree modules */
44 static bool trim_unused_exports;
45
46 /* ignore missing files */
47 static bool ignore_missing_files;
48 /* If set to 1, only warn (instead of error) about missing ns imports */
49 static bool allow_missing_ns_imports;
50
51 static bool error_occurred;
52
53 static bool extra_warn;
54
55 bool target_is_big_endian;
56 bool host_is_big_endian;
57
58 /*
59  * Cut off the warnings when there are too many. This typically occurs when
60  * vmlinux is missing. ('make modules' without building vmlinux.)
61  */
62 #define MAX_UNRESOLVED_REPORTS  10
63 static unsigned int nr_unresolved;
64
65 /* In kernel, this size is defined in linux/module.h;
66  * here we use Elf_Addr instead of long for covering cross-compile
67  */
68
69 #define MODULE_NAME_LEN (64 - sizeof(Elf_Addr))
70
71 void modpost_log(bool is_error, const char *fmt, ...)
72 {
73         va_list arglist;
74
75         if (is_error) {
76                 fprintf(stderr, "ERROR: ");
77                 error_occurred = true;
78         } else {
79                 fprintf(stderr, "WARNING: ");
80         }
81
82         fprintf(stderr, "modpost: ");
83
84         va_start(arglist, fmt);
85         vfprintf(stderr, fmt, arglist);
86         va_end(arglist);
87 }
88
89 static inline bool strends(const char *str, const char *postfix)
90 {
91         if (strlen(str) < strlen(postfix))
92                 return false;
93
94         return strcmp(str + strlen(str) - strlen(postfix), postfix) == 0;
95 }
96
97 char *read_text_file(const char *filename)
98 {
99         struct stat st;
100         size_t nbytes;
101         int fd;
102         char *buf;
103
104         fd = open(filename, O_RDONLY);
105         if (fd < 0) {
106                 perror(filename);
107                 exit(1);
108         }
109
110         if (fstat(fd, &st) < 0) {
111                 perror(filename);
112                 exit(1);
113         }
114
115         buf = xmalloc(st.st_size + 1);
116
117         nbytes = st.st_size;
118
119         while (nbytes) {
120                 ssize_t bytes_read;
121
122                 bytes_read = read(fd, buf, nbytes);
123                 if (bytes_read < 0) {
124                         perror(filename);
125                         exit(1);
126                 }
127
128                 nbytes -= bytes_read;
129         }
130         buf[st.st_size] = '\0';
131
132         close(fd);
133
134         return buf;
135 }
136
137 char *get_line(char **stringp)
138 {
139         char *orig = *stringp, *next;
140
141         /* do not return the unwanted extra line at EOF */
142         if (!orig || *orig == '\0')
143                 return NULL;
144
145         /* don't use strsep here, it is not available everywhere */
146         next = strchr(orig, '\n');
147         if (next)
148                 *next++ = '\0';
149
150         *stringp = next;
151
152         return orig;
153 }
154
155 /* A list of all modules we processed */
156 LIST_HEAD(modules);
157
158 static struct module *find_module(const char *filename, const char *modname)
159 {
160         struct module *mod;
161
162         list_for_each_entry(mod, &modules, list) {
163                 if (!strcmp(mod->dump_file, filename) &&
164                     !strcmp(mod->name, modname))
165                         return mod;
166         }
167         return NULL;
168 }
169
170 static struct module *new_module(const char *name, size_t namelen)
171 {
172         struct module *mod;
173
174         mod = xmalloc(sizeof(*mod) + namelen + 1);
175         memset(mod, 0, sizeof(*mod));
176
177         INIT_LIST_HEAD(&mod->exported_symbols);
178         INIT_LIST_HEAD(&mod->unresolved_symbols);
179         INIT_LIST_HEAD(&mod->missing_namespaces);
180         INIT_LIST_HEAD(&mod->imported_namespaces);
181         INIT_LIST_HEAD(&mod->aliases);
182
183         memcpy(mod->name, name, namelen);
184         mod->name[namelen] = '\0';
185         mod->is_vmlinux = (strcmp(mod->name, "vmlinux") == 0);
186
187         /*
188          * Set mod->is_gpl_compatible to true by default. If MODULE_LICENSE()
189          * is missing, do not check the use for EXPORT_SYMBOL_GPL() becasue
190          * modpost will exit wiht error anyway.
191          */
192         mod->is_gpl_compatible = true;
193
194         list_add_tail(&mod->list, &modules);
195
196         return mod;
197 }
198
199 struct symbol {
200         struct hlist_node hnode;/* link to hash table */
201         struct list_head list;  /* link to module::exported_symbols or module::unresolved_symbols */
202         struct module *module;
203         char *namespace;
204         unsigned int crc;
205         bool crc_valid;
206         bool weak;
207         bool is_func;
208         bool is_gpl_only;       /* exported by EXPORT_SYMBOL_GPL */
209         bool used;              /* there exists a user of this symbol */
210         char name[];
211 };
212
213 static HASHTABLE_DEFINE(symbol_hashtable, 1U << 10);
214
215 /**
216  * Allocate a new symbols for use in the hash of exported symbols or
217  * the list of unresolved symbols per module
218  **/
219 static struct symbol *alloc_symbol(const char *name)
220 {
221         struct symbol *s = xmalloc(sizeof(*s) + strlen(name) + 1);
222
223         memset(s, 0, sizeof(*s));
224         strcpy(s->name, name);
225
226         return s;
227 }
228
229 /* For the hash of exported symbols */
230 static void hash_add_symbol(struct symbol *sym)
231 {
232         hash_add(symbol_hashtable, &sym->hnode, hash_str(sym->name));
233 }
234
235 static void sym_add_unresolved(const char *name, struct module *mod, bool weak)
236 {
237         struct symbol *sym;
238
239         sym = alloc_symbol(name);
240         sym->weak = weak;
241
242         list_add_tail(&sym->list, &mod->unresolved_symbols);
243 }
244
245 static struct symbol *sym_find_with_module(const char *name, struct module *mod)
246 {
247         struct symbol *s;
248
249         /* For our purposes, .foo matches foo.  PPC64 needs this. */
250         if (name[0] == '.')
251                 name++;
252
253         hash_for_each_possible(symbol_hashtable, s, hnode, hash_str(name)) {
254                 if (strcmp(s->name, name) == 0 && (!mod || s->module == mod))
255                         return s;
256         }
257         return NULL;
258 }
259
260 static struct symbol *find_symbol(const char *name)
261 {
262         return sym_find_with_module(name, NULL);
263 }
264
265 struct namespace_list {
266         struct list_head list;
267         char namespace[];
268 };
269
270 static bool contains_namespace(struct list_head *head, const char *namespace)
271 {
272         struct namespace_list *list;
273
274         /*
275          * The default namespace is null string "", which is always implicitly
276          * contained.
277          */
278         if (!namespace[0])
279                 return true;
280
281         list_for_each_entry(list, head, list) {
282                 if (!strcmp(list->namespace, namespace))
283                         return true;
284         }
285
286         return false;
287 }
288
289 static void add_namespace(struct list_head *head, const char *namespace)
290 {
291         struct namespace_list *ns_entry;
292
293         if (!contains_namespace(head, namespace)) {
294                 ns_entry = xmalloc(sizeof(*ns_entry) + strlen(namespace) + 1);
295                 strcpy(ns_entry->namespace, namespace);
296                 list_add_tail(&ns_entry->list, head);
297         }
298 }
299
300 static void *sym_get_data_by_offset(const struct elf_info *info,
301                                     unsigned int secindex, unsigned long offset)
302 {
303         Elf_Shdr *sechdr = &info->sechdrs[secindex];
304
305         return (void *)info->hdr + sechdr->sh_offset + offset;
306 }
307
308 void *sym_get_data(const struct elf_info *info, const Elf_Sym *sym)
309 {
310         return sym_get_data_by_offset(info, get_secindex(info, sym),
311                                       sym->st_value);
312 }
313
314 static const char *sech_name(const struct elf_info *info, Elf_Shdr *sechdr)
315 {
316         return sym_get_data_by_offset(info, info->secindex_strings,
317                                       sechdr->sh_name);
318 }
319
320 static const char *sec_name(const struct elf_info *info, unsigned int secindex)
321 {
322         /*
323          * If sym->st_shndx is a special section index, there is no
324          * corresponding section header.
325          * Return "" if the index is out of range of info->sechdrs[] array.
326          */
327         if (secindex >= info->num_sections)
328                 return "";
329
330         return sech_name(info, &info->sechdrs[secindex]);
331 }
332
333 static struct symbol *sym_add_exported(const char *name, struct module *mod,
334                                        bool gpl_only, const char *namespace)
335 {
336         struct symbol *s = find_symbol(name);
337
338         if (s && (!external_module || s->module->is_vmlinux || s->module == mod)) {
339                 error("%s: '%s' exported twice. Previous export was in %s%s\n",
340                       mod->name, name, s->module->name,
341                       s->module->is_vmlinux ? "" : ".ko");
342         }
343
344         s = alloc_symbol(name);
345         s->module = mod;
346         s->is_gpl_only = gpl_only;
347         s->namespace = xstrdup(namespace);
348         list_add_tail(&s->list, &mod->exported_symbols);
349         hash_add_symbol(s);
350
351         return s;
352 }
353
354 static void sym_set_crc(struct symbol *sym, unsigned int crc)
355 {
356         sym->crc = crc;
357         sym->crc_valid = true;
358 }
359
360 static void *grab_file(const char *filename, size_t *size)
361 {
362         struct stat st;
363         void *map = MAP_FAILED;
364         int fd;
365
366         fd = open(filename, O_RDONLY);
367         if (fd < 0)
368                 return NULL;
369         if (fstat(fd, &st))
370                 goto failed;
371
372         *size = st.st_size;
373         map = mmap(NULL, *size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
374
375 failed:
376         close(fd);
377         if (map == MAP_FAILED)
378                 return NULL;
379         return map;
380 }
381
382 static void release_file(void *file, size_t size)
383 {
384         munmap(file, size);
385 }
386
387 static int parse_elf(struct elf_info *info, const char *filename)
388 {
389         unsigned int i;
390         Elf_Ehdr *hdr;
391         Elf_Shdr *sechdrs;
392         Elf_Sym  *sym;
393         const char *secstrings;
394         unsigned int symtab_idx = ~0U, symtab_shndx_idx = ~0U;
395
396         hdr = grab_file(filename, &info->size);
397         if (!hdr) {
398                 if (ignore_missing_files) {
399                         fprintf(stderr, "%s: %s (ignored)\n", filename,
400                                 strerror(errno));
401                         return 0;
402                 }
403                 perror(filename);
404                 exit(1);
405         }
406         info->hdr = hdr;
407         if (info->size < sizeof(*hdr)) {
408                 /* file too small, assume this is an empty .o file */
409                 return 0;
410         }
411         /* Is this a valid ELF file? */
412         if ((hdr->e_ident[EI_MAG0] != ELFMAG0) ||
413             (hdr->e_ident[EI_MAG1] != ELFMAG1) ||
414             (hdr->e_ident[EI_MAG2] != ELFMAG2) ||
415             (hdr->e_ident[EI_MAG3] != ELFMAG3)) {
416                 /* Not an ELF file - silently ignore it */
417                 return 0;
418         }
419
420         switch (hdr->e_ident[EI_DATA]) {
421         case ELFDATA2LSB:
422                 target_is_big_endian = false;
423                 break;
424         case ELFDATA2MSB:
425                 target_is_big_endian = true;
426                 break;
427         default:
428                 fatal("target endian is unknown\n");
429         }
430
431         /* Fix endianness in ELF header */
432         hdr->e_type      = TO_NATIVE(hdr->e_type);
433         hdr->e_machine   = TO_NATIVE(hdr->e_machine);
434         hdr->e_version   = TO_NATIVE(hdr->e_version);
435         hdr->e_entry     = TO_NATIVE(hdr->e_entry);
436         hdr->e_phoff     = TO_NATIVE(hdr->e_phoff);
437         hdr->e_shoff     = TO_NATIVE(hdr->e_shoff);
438         hdr->e_flags     = TO_NATIVE(hdr->e_flags);
439         hdr->e_ehsize    = TO_NATIVE(hdr->e_ehsize);
440         hdr->e_phentsize = TO_NATIVE(hdr->e_phentsize);
441         hdr->e_phnum     = TO_NATIVE(hdr->e_phnum);
442         hdr->e_shentsize = TO_NATIVE(hdr->e_shentsize);
443         hdr->e_shnum     = TO_NATIVE(hdr->e_shnum);
444         hdr->e_shstrndx  = TO_NATIVE(hdr->e_shstrndx);
445         sechdrs = (void *)hdr + hdr->e_shoff;
446         info->sechdrs = sechdrs;
447
448         /* modpost only works for relocatable objects */
449         if (hdr->e_type != ET_REL)
450                 fatal("%s: not relocatable object.", filename);
451
452         /* Check if file offset is correct */
453         if (hdr->e_shoff > info->size)
454                 fatal("section header offset=%lu in file '%s' is bigger than filesize=%zu\n",
455                       (unsigned long)hdr->e_shoff, filename, info->size);
456
457         if (hdr->e_shnum == SHN_UNDEF) {
458                 /*
459                  * There are more than 64k sections,
460                  * read count from .sh_size.
461                  */
462                 info->num_sections = TO_NATIVE(sechdrs[0].sh_size);
463         }
464         else {
465                 info->num_sections = hdr->e_shnum;
466         }
467         if (hdr->e_shstrndx == SHN_XINDEX) {
468                 info->secindex_strings = TO_NATIVE(sechdrs[0].sh_link);
469         }
470         else {
471                 info->secindex_strings = hdr->e_shstrndx;
472         }
473
474         /* Fix endianness in section headers */
475         for (i = 0; i < info->num_sections; i++) {
476                 sechdrs[i].sh_name      = TO_NATIVE(sechdrs[i].sh_name);
477                 sechdrs[i].sh_type      = TO_NATIVE(sechdrs[i].sh_type);
478                 sechdrs[i].sh_flags     = TO_NATIVE(sechdrs[i].sh_flags);
479                 sechdrs[i].sh_addr      = TO_NATIVE(sechdrs[i].sh_addr);
480                 sechdrs[i].sh_offset    = TO_NATIVE(sechdrs[i].sh_offset);
481                 sechdrs[i].sh_size      = TO_NATIVE(sechdrs[i].sh_size);
482                 sechdrs[i].sh_link      = TO_NATIVE(sechdrs[i].sh_link);
483                 sechdrs[i].sh_info      = TO_NATIVE(sechdrs[i].sh_info);
484                 sechdrs[i].sh_addralign = TO_NATIVE(sechdrs[i].sh_addralign);
485                 sechdrs[i].sh_entsize   = TO_NATIVE(sechdrs[i].sh_entsize);
486         }
487         /* Find symbol table. */
488         secstrings = (void *)hdr + sechdrs[info->secindex_strings].sh_offset;
489         for (i = 1; i < info->num_sections; i++) {
490                 const char *secname;
491                 int nobits = sechdrs[i].sh_type == SHT_NOBITS;
492
493                 if (!nobits && sechdrs[i].sh_offset > info->size)
494                         fatal("%s is truncated. sechdrs[i].sh_offset=%lu > sizeof(*hrd)=%zu\n",
495                               filename, (unsigned long)sechdrs[i].sh_offset,
496                               sizeof(*hdr));
497
498                 secname = secstrings + sechdrs[i].sh_name;
499                 if (strcmp(secname, ".modinfo") == 0) {
500                         if (nobits)
501                                 fatal("%s has NOBITS .modinfo\n", filename);
502                         info->modinfo = (void *)hdr + sechdrs[i].sh_offset;
503                         info->modinfo_len = sechdrs[i].sh_size;
504                 } else if (!strcmp(secname, ".export_symbol")) {
505                         info->export_symbol_secndx = i;
506                 }
507
508                 if (sechdrs[i].sh_type == SHT_SYMTAB) {
509                         unsigned int sh_link_idx;
510                         symtab_idx = i;
511                         info->symtab_start = (void *)hdr +
512                             sechdrs[i].sh_offset;
513                         info->symtab_stop  = (void *)hdr +
514                             sechdrs[i].sh_offset + sechdrs[i].sh_size;
515                         sh_link_idx = sechdrs[i].sh_link;
516                         info->strtab       = (void *)hdr +
517                             sechdrs[sh_link_idx].sh_offset;
518                 }
519
520                 /* 32bit section no. table? ("more than 64k sections") */
521                 if (sechdrs[i].sh_type == SHT_SYMTAB_SHNDX) {
522                         symtab_shndx_idx = i;
523                         info->symtab_shndx_start = (void *)hdr +
524                             sechdrs[i].sh_offset;
525                         info->symtab_shndx_stop  = (void *)hdr +
526                             sechdrs[i].sh_offset + sechdrs[i].sh_size;
527                 }
528         }
529         if (!info->symtab_start)
530                 fatal("%s has no symtab?\n", filename);
531
532         /* Fix endianness in symbols */
533         for (sym = info->symtab_start; sym < info->symtab_stop; sym++) {
534                 sym->st_shndx = TO_NATIVE(sym->st_shndx);
535                 sym->st_name  = TO_NATIVE(sym->st_name);
536                 sym->st_value = TO_NATIVE(sym->st_value);
537                 sym->st_size  = TO_NATIVE(sym->st_size);
538         }
539
540         if (symtab_shndx_idx != ~0U) {
541                 Elf32_Word *p;
542                 if (symtab_idx != sechdrs[symtab_shndx_idx].sh_link)
543                         fatal("%s: SYMTAB_SHNDX has bad sh_link: %u!=%u\n",
544                               filename, sechdrs[symtab_shndx_idx].sh_link,
545                               symtab_idx);
546                 /* Fix endianness */
547                 for (p = info->symtab_shndx_start; p < info->symtab_shndx_stop;
548                      p++)
549                         *p = TO_NATIVE(*p);
550         }
551
552         symsearch_init(info);
553
554         return 1;
555 }
556
557 static void parse_elf_finish(struct elf_info *info)
558 {
559         symsearch_finish(info);
560         release_file(info->hdr, info->size);
561 }
562
563 static int ignore_undef_symbol(struct elf_info *info, const char *symname)
564 {
565         /* ignore __this_module, it will be resolved shortly */
566         if (strcmp(symname, "__this_module") == 0)
567                 return 1;
568         /* ignore global offset table */
569         if (strcmp(symname, "_GLOBAL_OFFSET_TABLE_") == 0)
570                 return 1;
571         if (info->hdr->e_machine == EM_PPC)
572                 /* Special register function linked on all modules during final link of .ko */
573                 if (strstarts(symname, "_restgpr_") ||
574                     strstarts(symname, "_savegpr_") ||
575                     strstarts(symname, "_rest32gpr_") ||
576                     strstarts(symname, "_save32gpr_") ||
577                     strstarts(symname, "_restvr_") ||
578                     strstarts(symname, "_savevr_"))
579                         return 1;
580         if (info->hdr->e_machine == EM_PPC64)
581                 /* Special register function linked on all modules during final link of .ko */
582                 if (strstarts(symname, "_restgpr0_") ||
583                     strstarts(symname, "_savegpr0_") ||
584                     strstarts(symname, "_restvr_") ||
585                     strstarts(symname, "_savevr_") ||
586                     strcmp(symname, ".TOC.") == 0)
587                         return 1;
588         /* Do not ignore this symbol */
589         return 0;
590 }
591
592 static void handle_symbol(struct module *mod, struct elf_info *info,
593                           const Elf_Sym *sym, const char *symname)
594 {
595         switch (sym->st_shndx) {
596         case SHN_COMMON:
597                 if (strstarts(symname, "__gnu_lto_")) {
598                         /* Should warn here, but modpost runs before the linker */
599                 } else
600                         warn("\"%s\" [%s] is COMMON symbol\n", symname, mod->name);
601                 break;
602         case SHN_UNDEF:
603                 /* undefined symbol */
604                 if (ELF_ST_BIND(sym->st_info) != STB_GLOBAL &&
605                     ELF_ST_BIND(sym->st_info) != STB_WEAK)
606                         break;
607                 if (ignore_undef_symbol(info, symname))
608                         break;
609                 if (info->hdr->e_machine == EM_SPARC ||
610                     info->hdr->e_machine == EM_SPARCV9) {
611                         /* Ignore register directives. */
612                         if (ELF_ST_TYPE(sym->st_info) == STT_SPARC_REGISTER)
613                                 break;
614                         if (symname[0] == '.') {
615                                 char *munged = xstrdup(symname);
616                                 munged[0] = '_';
617                                 munged[1] = toupper(munged[1]);
618                                 symname = munged;
619                         }
620                 }
621
622                 sym_add_unresolved(symname, mod,
623                                    ELF_ST_BIND(sym->st_info) == STB_WEAK);
624                 break;
625         default:
626                 if (strcmp(symname, "init_module") == 0)
627                         mod->has_init = true;
628                 if (strcmp(symname, "cleanup_module") == 0)
629                         mod->has_cleanup = true;
630                 break;
631         }
632 }
633
634 /**
635  * Parse tag=value strings from .modinfo section
636  **/
637 static char *next_string(char *string, unsigned long *secsize)
638 {
639         /* Skip non-zero chars */
640         while (string[0]) {
641                 string++;
642                 if ((*secsize)-- <= 1)
643                         return NULL;
644         }
645
646         /* Skip any zero padding. */
647         while (!string[0]) {
648                 string++;
649                 if ((*secsize)-- <= 1)
650                         return NULL;
651         }
652         return string;
653 }
654
655 static char *get_next_modinfo(struct elf_info *info, const char *tag,
656                               char *prev)
657 {
658         char *p;
659         unsigned int taglen = strlen(tag);
660         char *modinfo = info->modinfo;
661         unsigned long size = info->modinfo_len;
662
663         if (prev) {
664                 size -= prev - modinfo;
665                 modinfo = next_string(prev, &size);
666         }
667
668         for (p = modinfo; p; p = next_string(p, &size)) {
669                 if (strncmp(p, tag, taglen) == 0 && p[taglen] == '=')
670                         return p + taglen + 1;
671         }
672         return NULL;
673 }
674
675 static char *get_modinfo(struct elf_info *info, const char *tag)
676
677 {
678         return get_next_modinfo(info, tag, NULL);
679 }
680
681 static const char *sym_name(struct elf_info *elf, Elf_Sym *sym)
682 {
683         return sym ? elf->strtab + sym->st_name : "";
684 }
685
686 /*
687  * Check whether the 'string' argument matches one of the 'patterns',
688  * an array of shell wildcard patterns (glob).
689  *
690  * Return true is there is a match.
691  */
692 static bool match(const char *string, const char *const patterns[])
693 {
694         const char *pattern;
695
696         while ((pattern = *patterns++)) {
697                 if (!fnmatch(pattern, string, 0))
698                         return true;
699         }
700
701         return false;
702 }
703
704 /* useful to pass patterns to match() directly */
705 #define PATTERNS(...) \
706         ({ \
707                 static const char *const patterns[] = {__VA_ARGS__, NULL}; \
708                 patterns; \
709         })
710
711 /* sections that we do not want to do full section mismatch check on */
712 static const char *const section_white_list[] =
713 {
714         ".comment*",
715         ".debug*",
716         ".zdebug*",             /* Compressed debug sections. */
717         ".GCC.command.line",    /* record-gcc-switches */
718         ".mdebug*",        /* alpha, score, mips etc. */
719         ".pdr",            /* alpha, score, mips etc. */
720         ".stab*",
721         ".note*",
722         ".got*",
723         ".toc*",
724         ".xt.prop",                              /* xtensa */
725         ".xt.lit",         /* xtensa */
726         ".arcextmap*",                  /* arc */
727         ".gnu.linkonce.arcext*",        /* arc : modules */
728         ".cmem*",                       /* EZchip */
729         ".fmt_slot*",                   /* EZchip */
730         ".gnu.lto*",
731         ".discard.*",
732         ".llvm.call-graph-profile",     /* call graph */
733         NULL
734 };
735
736 /*
737  * This is used to find sections missing the SHF_ALLOC flag.
738  * The cause of this is often a section specified in assembler
739  * without "ax" / "aw".
740  */
741 static void check_section(const char *modname, struct elf_info *elf,
742                           Elf_Shdr *sechdr)
743 {
744         const char *sec = sech_name(elf, sechdr);
745
746         if (sechdr->sh_type == SHT_PROGBITS &&
747             !(sechdr->sh_flags & SHF_ALLOC) &&
748             !match(sec, section_white_list)) {
749                 warn("%s (%s): unexpected non-allocatable section.\n"
750                      "Did you forget to use \"ax\"/\"aw\" in a .S file?\n"
751                      "Note that for example <linux/init.h> contains\n"
752                      "section definitions for use in .S files.\n\n",
753                      modname, sec);
754         }
755 }
756
757
758
759 #define ALL_INIT_DATA_SECTIONS \
760         ".init.setup", ".init.rodata", ".init.data"
761
762 #define ALL_PCI_INIT_SECTIONS   \
763         ".pci_fixup_early", ".pci_fixup_header", ".pci_fixup_final", \
764         ".pci_fixup_enable", ".pci_fixup_resume", \
765         ".pci_fixup_resume_early", ".pci_fixup_suspend"
766
767 #define ALL_INIT_SECTIONS ".init.*"
768 #define ALL_EXIT_SECTIONS ".exit.*"
769
770 #define DATA_SECTIONS ".data", ".data.rel"
771 #define TEXT_SECTIONS ".text", ".text.*", ".sched.text", \
772                 ".kprobes.text", ".cpuidle.text", ".noinstr.text", \
773                 ".ltext", ".ltext.*"
774 #define OTHER_TEXT_SECTIONS ".ref.text", ".head.text", ".spinlock.text", \
775                 ".fixup", ".entry.text", ".exception.text", \
776                 ".coldtext", ".softirqentry.text", ".irqentry.text"
777
778 #define ALL_TEXT_SECTIONS  ".init.text", ".exit.text", \
779                 TEXT_SECTIONS, OTHER_TEXT_SECTIONS
780
781 enum mismatch {
782         TEXTDATA_TO_ANY_INIT_EXIT,
783         XXXINIT_TO_SOME_INIT,
784         ANY_INIT_TO_ANY_EXIT,
785         ANY_EXIT_TO_ANY_INIT,
786         EXTABLE_TO_NON_TEXT,
787 };
788
789 /**
790  * Describe how to match sections on different criteria:
791  *
792  * @fromsec: Array of sections to be matched.
793  *
794  * @bad_tosec: Relocations applied to a section in @fromsec to a section in
795  * this array is forbidden (black-list).  Can be empty.
796  *
797  * @good_tosec: Relocations applied to a section in @fromsec must be
798  * targeting sections in this array (white-list).  Can be empty.
799  *
800  * @mismatch: Type of mismatch.
801  */
802 struct sectioncheck {
803         const char *fromsec[20];
804         const char *bad_tosec[20];
805         const char *good_tosec[20];
806         enum mismatch mismatch;
807 };
808
809 static const struct sectioncheck sectioncheck[] = {
810 /* Do not reference init/exit code/data from
811  * normal code and data
812  */
813 {
814         .fromsec = { TEXT_SECTIONS, DATA_SECTIONS, NULL },
815         .bad_tosec = { ALL_INIT_SECTIONS, ALL_EXIT_SECTIONS, NULL },
816         .mismatch = TEXTDATA_TO_ANY_INIT_EXIT,
817 },
818 /* Do not use exit code/data from init code */
819 {
820         .fromsec = { ALL_INIT_SECTIONS, NULL },
821         .bad_tosec = { ALL_EXIT_SECTIONS, NULL },
822         .mismatch = ANY_INIT_TO_ANY_EXIT,
823 },
824 /* Do not use init code/data from exit code */
825 {
826         .fromsec = { ALL_EXIT_SECTIONS, NULL },
827         .bad_tosec = { ALL_INIT_SECTIONS, NULL },
828         .mismatch = ANY_EXIT_TO_ANY_INIT,
829 },
830 {
831         .fromsec = { ALL_PCI_INIT_SECTIONS, NULL },
832         .bad_tosec = { ALL_INIT_SECTIONS, NULL },
833         .mismatch = ANY_INIT_TO_ANY_EXIT,
834 },
835 {
836         .fromsec = { "__ex_table", NULL },
837         /* If you're adding any new black-listed sections in here, consider
838          * adding a special 'printer' for them in scripts/check_extable.
839          */
840         .bad_tosec = { ".altinstr_replacement", NULL },
841         .good_tosec = {ALL_TEXT_SECTIONS , NULL},
842         .mismatch = EXTABLE_TO_NON_TEXT,
843 }
844 };
845
846 static const struct sectioncheck *section_mismatch(
847                 const char *fromsec, const char *tosec)
848 {
849         int i;
850
851         /*
852          * The target section could be the SHT_NUL section when we're
853          * handling relocations to un-resolved symbols, trying to match it
854          * doesn't make much sense and causes build failures on parisc
855          * architectures.
856          */
857         if (*tosec == '\0')
858                 return NULL;
859
860         for (i = 0; i < ARRAY_SIZE(sectioncheck); i++) {
861                 const struct sectioncheck *check = &sectioncheck[i];
862
863                 if (match(fromsec, check->fromsec)) {
864                         if (check->bad_tosec[0] && match(tosec, check->bad_tosec))
865                                 return check;
866                         if (check->good_tosec[0] && !match(tosec, check->good_tosec))
867                                 return check;
868                 }
869         }
870         return NULL;
871 }
872
873 /**
874  * Whitelist to allow certain references to pass with no warning.
875  *
876  * Pattern 1:
877  *   If a module parameter is declared __initdata and permissions=0
878  *   then this is legal despite the warning generated.
879  *   We cannot see value of permissions here, so just ignore
880  *   this pattern.
881  *   The pattern is identified by:
882  *   tosec   = .init.data
883  *   fromsec = .data*
884  *   atsym   =__param*
885  *
886  * Pattern 1a:
887  *   module_param_call() ops can refer to __init set function if permissions=0
888  *   The pattern is identified by:
889  *   tosec   = .init.text
890  *   fromsec = .data*
891  *   atsym   = __param_ops_*
892  *
893  * Pattern 3:
894  *   Whitelist all references from .head.text to any init section
895  *
896  * Pattern 4:
897  *   Some symbols belong to init section but still it is ok to reference
898  *   these from non-init sections as these symbols don't have any memory
899  *   allocated for them and symbol address and value are same. So even
900  *   if init section is freed, its ok to reference those symbols.
901  *   For ex. symbols marking the init section boundaries.
902  *   This pattern is identified by
903  *   refsymname = __init_begin, _sinittext, _einittext
904  *
905  * Pattern 5:
906  *   GCC may optimize static inlines when fed constant arg(s) resulting
907  *   in functions like cpumask_empty() -- generating an associated symbol
908  *   cpumask_empty.constprop.3 that appears in the audit.  If the const that
909  *   is passed in comes from __init, like say nmi_ipi_mask, we get a
910  *   meaningless section warning.  May need to add isra symbols too...
911  *   This pattern is identified by
912  *   tosec   = init section
913  *   fromsec = text section
914  *   refsymname = *.constprop.*
915  *
916  **/
917 static int secref_whitelist(const char *fromsec, const char *fromsym,
918                             const char *tosec, const char *tosym)
919 {
920         /* Check for pattern 1 */
921         if (match(tosec, PATTERNS(ALL_INIT_DATA_SECTIONS)) &&
922             match(fromsec, PATTERNS(DATA_SECTIONS)) &&
923             strstarts(fromsym, "__param"))
924                 return 0;
925
926         /* Check for pattern 1a */
927         if (strcmp(tosec, ".init.text") == 0 &&
928             match(fromsec, PATTERNS(DATA_SECTIONS)) &&
929             strstarts(fromsym, "__param_ops_"))
930                 return 0;
931
932         /* symbols in data sections that may refer to any init/exit sections */
933         if (match(fromsec, PATTERNS(DATA_SECTIONS)) &&
934             match(tosec, PATTERNS(ALL_INIT_SECTIONS, ALL_EXIT_SECTIONS)) &&
935             match(fromsym, PATTERNS("*_ops", "*_probe", "*_console")))
936                 return 0;
937
938         /* Check for pattern 3 */
939         if (strstarts(fromsec, ".head.text") &&
940             match(tosec, PATTERNS(ALL_INIT_SECTIONS)))
941                 return 0;
942
943         /* Check for pattern 4 */
944         if (match(tosym, PATTERNS("__init_begin", "_sinittext", "_einittext")))
945                 return 0;
946
947         /* Check for pattern 5 */
948         if (match(fromsec, PATTERNS(ALL_TEXT_SECTIONS)) &&
949             match(tosec, PATTERNS(ALL_INIT_SECTIONS)) &&
950             match(fromsym, PATTERNS("*.constprop.*")))
951                 return 0;
952
953         return 1;
954 }
955
956 static Elf_Sym *find_fromsym(struct elf_info *elf, Elf_Addr addr,
957                              unsigned int secndx)
958 {
959         return symsearch_find_nearest(elf, addr, secndx, false, ~0);
960 }
961
962 static Elf_Sym *find_tosym(struct elf_info *elf, Elf_Addr addr, Elf_Sym *sym)
963 {
964         Elf_Sym *new_sym;
965
966         /* If the supplied symbol has a valid name, return it */
967         if (is_valid_name(elf, sym))
968                 return sym;
969
970         /*
971          * Strive to find a better symbol name, but the resulting name may not
972          * match the symbol referenced in the original code.
973          */
974         new_sym = symsearch_find_nearest(elf, addr, get_secindex(elf, sym),
975                                          true, 20);
976         return new_sym ? new_sym : sym;
977 }
978
979 static bool is_executable_section(struct elf_info *elf, unsigned int secndx)
980 {
981         if (secndx >= elf->num_sections)
982                 return false;
983
984         return (elf->sechdrs[secndx].sh_flags & SHF_EXECINSTR) != 0;
985 }
986
987 static void default_mismatch_handler(const char *modname, struct elf_info *elf,
988                                      const struct sectioncheck* const mismatch,
989                                      Elf_Sym *tsym,
990                                      unsigned int fsecndx, const char *fromsec, Elf_Addr faddr,
991                                      const char *tosec, Elf_Addr taddr)
992 {
993         Elf_Sym *from;
994         const char *tosym;
995         const char *fromsym;
996         char taddr_str[16];
997
998         from = find_fromsym(elf, faddr, fsecndx);
999         fromsym = sym_name(elf, from);
1000
1001         tsym = find_tosym(elf, taddr, tsym);
1002         tosym = sym_name(elf, tsym);
1003
1004         /* check whitelist - we may ignore it */
1005         if (!secref_whitelist(fromsec, fromsym, tosec, tosym))
1006                 return;
1007
1008         sec_mismatch_count++;
1009
1010         if (!tosym[0])
1011                 snprintf(taddr_str, sizeof(taddr_str), "0x%x", (unsigned int)taddr);
1012
1013         /*
1014          * The format for the reference source:      <symbol_name>+<offset> or <address>
1015          * The format for the reference destination: <symbol_name>          or <address>
1016          */
1017         warn("%s: section mismatch in reference: %s%s0x%x (section: %s) -> %s (section: %s)\n",
1018              modname, fromsym, fromsym[0] ? "+" : "",
1019              (unsigned int)(faddr - (fromsym[0] ? from->st_value : 0)),
1020              fromsec, tosym[0] ? tosym : taddr_str, tosec);
1021
1022         if (mismatch->mismatch == EXTABLE_TO_NON_TEXT) {
1023                 if (match(tosec, mismatch->bad_tosec))
1024                         fatal("The relocation at %s+0x%lx references\n"
1025                               "section \"%s\" which is black-listed.\n"
1026                               "Something is seriously wrong and should be fixed.\n"
1027                               "You might get more information about where this is\n"
1028                               "coming from by using scripts/check_extable.sh %s\n",
1029                               fromsec, (long)faddr, tosec, modname);
1030                 else if (is_executable_section(elf, get_secindex(elf, tsym)))
1031                         warn("The relocation at %s+0x%lx references\n"
1032                              "section \"%s\" which is not in the list of\n"
1033                              "authorized sections.  If you're adding a new section\n"
1034                              "and/or if this reference is valid, add \"%s\" to the\n"
1035                              "list of authorized sections to jump to on fault.\n"
1036                              "This can be achieved by adding \"%s\" to\n"
1037                              "OTHER_TEXT_SECTIONS in scripts/mod/modpost.c.\n",
1038                              fromsec, (long)faddr, tosec, tosec, tosec);
1039                 else
1040                         error("%s+0x%lx references non-executable section '%s'\n",
1041                               fromsec, (long)faddr, tosec);
1042         }
1043 }
1044
1045 static void check_export_symbol(struct module *mod, struct elf_info *elf,
1046                                 Elf_Addr faddr, const char *secname,
1047                                 Elf_Sym *sym)
1048 {
1049         static const char *prefix = "__export_symbol_";
1050         const char *label_name, *name, *data;
1051         Elf_Sym *label;
1052         struct symbol *s;
1053         bool is_gpl;
1054
1055         label = find_fromsym(elf, faddr, elf->export_symbol_secndx);
1056         label_name = sym_name(elf, label);
1057
1058         if (!strstarts(label_name, prefix)) {
1059                 error("%s: .export_symbol section contains strange symbol '%s'\n",
1060                       mod->name, label_name);
1061                 return;
1062         }
1063
1064         if (ELF_ST_BIND(sym->st_info) != STB_GLOBAL &&
1065             ELF_ST_BIND(sym->st_info) != STB_WEAK) {
1066                 error("%s: local symbol '%s' was exported\n", mod->name,
1067                       label_name + strlen(prefix));
1068                 return;
1069         }
1070
1071         name = sym_name(elf, sym);
1072         if (strcmp(label_name + strlen(prefix), name)) {
1073                 error("%s: .export_symbol section references '%s', but it does not seem to be an export symbol\n",
1074                       mod->name, name);
1075                 return;
1076         }
1077
1078         data = sym_get_data(elf, label);        /* license */
1079         if (!strcmp(data, "GPL")) {
1080                 is_gpl = true;
1081         } else if (!strcmp(data, "")) {
1082                 is_gpl = false;
1083         } else {
1084                 error("%s: unknown license '%s' was specified for '%s'\n",
1085                       mod->name, data, name);
1086                 return;
1087         }
1088
1089         data += strlen(data) + 1;       /* namespace */
1090         s = sym_add_exported(name, mod, is_gpl, data);
1091
1092         /*
1093          * We need to be aware whether we are exporting a function or
1094          * a data on some architectures.
1095          */
1096         s->is_func = (ELF_ST_TYPE(sym->st_info) == STT_FUNC);
1097
1098         /*
1099          * For parisc64, symbols prefixed $$ from the library have the symbol type
1100          * STT_LOPROC. They should be handled as functions too.
1101          */
1102         if (elf->hdr->e_ident[EI_CLASS] == ELFCLASS64 &&
1103             elf->hdr->e_machine == EM_PARISC &&
1104             ELF_ST_TYPE(sym->st_info) == STT_LOPROC)
1105                 s->is_func = true;
1106
1107         if (match(secname, PATTERNS(ALL_INIT_SECTIONS)))
1108                 warn("%s: %s: EXPORT_SYMBOL used for init symbol. Remove __init or EXPORT_SYMBOL.\n",
1109                      mod->name, name);
1110         else if (match(secname, PATTERNS(ALL_EXIT_SECTIONS)))
1111                 warn("%s: %s: EXPORT_SYMBOL used for exit symbol. Remove __exit or EXPORT_SYMBOL.\n",
1112                      mod->name, name);
1113 }
1114
1115 static void check_section_mismatch(struct module *mod, struct elf_info *elf,
1116                                    Elf_Sym *sym,
1117                                    unsigned int fsecndx, const char *fromsec,
1118                                    Elf_Addr faddr, Elf_Addr taddr)
1119 {
1120         const char *tosec = sec_name(elf, get_secindex(elf, sym));
1121         const struct sectioncheck *mismatch;
1122
1123         if (module_enabled && elf->export_symbol_secndx == fsecndx) {
1124                 check_export_symbol(mod, elf, faddr, tosec, sym);
1125                 return;
1126         }
1127
1128         mismatch = section_mismatch(fromsec, tosec);
1129         if (!mismatch)
1130                 return;
1131
1132         default_mismatch_handler(mod->name, elf, mismatch, sym,
1133                                  fsecndx, fromsec, faddr,
1134                                  tosec, taddr);
1135 }
1136
1137 static Elf_Addr addend_386_rel(uint32_t *location, unsigned int r_type)
1138 {
1139         switch (r_type) {
1140         case R_386_32:
1141                 return get_unaligned_native(location);
1142         case R_386_PC32:
1143                 return get_unaligned_native(location) + 4;
1144         }
1145
1146         return (Elf_Addr)(-1);
1147 }
1148
1149 static int32_t sign_extend32(int32_t value, int index)
1150 {
1151         uint8_t shift = 31 - index;
1152
1153         return (int32_t)(value << shift) >> shift;
1154 }
1155
1156 static Elf_Addr addend_arm_rel(void *loc, Elf_Sym *sym, unsigned int r_type)
1157 {
1158         uint32_t inst, upper, lower, sign, j1, j2;
1159         int32_t offset;
1160
1161         switch (r_type) {
1162         case R_ARM_ABS32:
1163         case R_ARM_REL32:
1164                 inst = get_unaligned_native((uint32_t *)loc);
1165                 return inst + sym->st_value;
1166         case R_ARM_MOVW_ABS_NC:
1167         case R_ARM_MOVT_ABS:
1168                 inst = get_unaligned_native((uint32_t *)loc);
1169                 offset = sign_extend32(((inst & 0xf0000) >> 4) | (inst & 0xfff),
1170                                        15);
1171                 return offset + sym->st_value;
1172         case R_ARM_PC24:
1173         case R_ARM_CALL:
1174         case R_ARM_JUMP24:
1175                 inst = get_unaligned_native((uint32_t *)loc);
1176                 offset = sign_extend32((inst & 0x00ffffff) << 2, 25);
1177                 return offset + sym->st_value + 8;
1178         case R_ARM_THM_MOVW_ABS_NC:
1179         case R_ARM_THM_MOVT_ABS:
1180                 upper = get_unaligned_native((uint16_t *)loc);
1181                 lower = get_unaligned_native((uint16_t *)loc + 1);
1182                 offset = sign_extend32(((upper & 0x000f) << 12) |
1183                                        ((upper & 0x0400) << 1) |
1184                                        ((lower & 0x7000) >> 4) |
1185                                        (lower & 0x00ff),
1186                                        15);
1187                 return offset + sym->st_value;
1188         case R_ARM_THM_JUMP19:
1189                 /*
1190                  * Encoding T3:
1191                  * S     = upper[10]
1192                  * imm6  = upper[5:0]
1193                  * J1    = lower[13]
1194                  * J2    = lower[11]
1195                  * imm11 = lower[10:0]
1196                  * imm32 = SignExtend(S:J2:J1:imm6:imm11:'0')
1197                  */
1198                 upper = get_unaligned_native((uint16_t *)loc);
1199                 lower = get_unaligned_native((uint16_t *)loc + 1);
1200
1201                 sign = (upper >> 10) & 1;
1202                 j1 = (lower >> 13) & 1;
1203                 j2 = (lower >> 11) & 1;
1204                 offset = sign_extend32((sign << 20) | (j2 << 19) | (j1 << 18) |
1205                                        ((upper & 0x03f) << 12) |
1206                                        ((lower & 0x07ff) << 1),
1207                                        20);
1208                 return offset + sym->st_value + 4;
1209         case R_ARM_THM_PC22:
1210         case R_ARM_THM_JUMP24:
1211                 /*
1212                  * Encoding T4:
1213                  * S     = upper[10]
1214                  * imm10 = upper[9:0]
1215                  * J1    = lower[13]
1216                  * J2    = lower[11]
1217                  * imm11 = lower[10:0]
1218                  * I1    = NOT(J1 XOR S)
1219                  * I2    = NOT(J2 XOR S)
1220                  * imm32 = SignExtend(S:I1:I2:imm10:imm11:'0')
1221                  */
1222                 upper = get_unaligned_native((uint16_t *)loc);
1223                 lower = get_unaligned_native((uint16_t *)loc + 1);
1224
1225                 sign = (upper >> 10) & 1;
1226                 j1 = (lower >> 13) & 1;
1227                 j2 = (lower >> 11) & 1;
1228                 offset = sign_extend32((sign << 24) |
1229                                        ((~(j1 ^ sign) & 1) << 23) |
1230                                        ((~(j2 ^ sign) & 1) << 22) |
1231                                        ((upper & 0x03ff) << 12) |
1232                                        ((lower & 0x07ff) << 1),
1233                                        24);
1234                 return offset + sym->st_value + 4;
1235         }
1236
1237         return (Elf_Addr)(-1);
1238 }
1239
1240 static Elf_Addr addend_mips_rel(uint32_t *location, unsigned int r_type)
1241 {
1242         uint32_t inst;
1243
1244         inst = get_unaligned_native(location);
1245         switch (r_type) {
1246         case R_MIPS_LO16:
1247                 return inst & 0xffff;
1248         case R_MIPS_26:
1249                 return (inst & 0x03ffffff) << 2;
1250         case R_MIPS_32:
1251                 return inst;
1252         }
1253         return (Elf_Addr)(-1);
1254 }
1255
1256 #ifndef EM_RISCV
1257 #define EM_RISCV                243
1258 #endif
1259
1260 #ifndef R_RISCV_SUB32
1261 #define R_RISCV_SUB32           39
1262 #endif
1263
1264 #ifndef EM_LOONGARCH
1265 #define EM_LOONGARCH            258
1266 #endif
1267
1268 #ifndef R_LARCH_SUB32
1269 #define R_LARCH_SUB32           55
1270 #endif
1271
1272 #ifndef R_LARCH_RELAX
1273 #define R_LARCH_RELAX           100
1274 #endif
1275
1276 #ifndef R_LARCH_ALIGN
1277 #define R_LARCH_ALIGN           102
1278 #endif
1279
1280 static void get_rel_type_and_sym(struct elf_info *elf, uint64_t r_info,
1281                                  unsigned int *r_type, unsigned int *r_sym)
1282 {
1283         typedef struct {
1284                 Elf64_Word    r_sym;    /* Symbol index */
1285                 unsigned char r_ssym;   /* Special symbol for 2nd relocation */
1286                 unsigned char r_type3;  /* 3rd relocation type */
1287                 unsigned char r_type2;  /* 2nd relocation type */
1288                 unsigned char r_type;   /* 1st relocation type */
1289         } Elf64_Mips_R_Info;
1290
1291         bool is_64bit = (elf->hdr->e_ident[EI_CLASS] == ELFCLASS64);
1292
1293         if (elf->hdr->e_machine == EM_MIPS && is_64bit) {
1294                 Elf64_Mips_R_Info *mips64_r_info = (void *)&r_info;
1295
1296                 *r_type = mips64_r_info->r_type;
1297                 *r_sym = TO_NATIVE(mips64_r_info->r_sym);
1298                 return;
1299         }
1300
1301         if (is_64bit)
1302                 r_info = TO_NATIVE((Elf64_Xword)r_info);
1303         else
1304                 r_info = TO_NATIVE((Elf32_Word)r_info);
1305
1306         *r_type = ELF_R_TYPE(r_info);
1307         *r_sym = ELF_R_SYM(r_info);
1308 }
1309
1310 static void section_rela(struct module *mod, struct elf_info *elf,
1311                          unsigned int fsecndx, const char *fromsec,
1312                          const Elf_Rela *start, const Elf_Rela *stop)
1313 {
1314         const Elf_Rela *rela;
1315
1316         for (rela = start; rela < stop; rela++) {
1317                 Elf_Sym *tsym;
1318                 Elf_Addr taddr, r_offset;
1319                 unsigned int r_type, r_sym;
1320
1321                 r_offset = TO_NATIVE(rela->r_offset);
1322                 get_rel_type_and_sym(elf, rela->r_info, &r_type, &r_sym);
1323
1324                 tsym = elf->symtab_start + r_sym;
1325                 taddr = tsym->st_value + TO_NATIVE(rela->r_addend);
1326
1327                 switch (elf->hdr->e_machine) {
1328                 case EM_RISCV:
1329                         if (!strcmp("__ex_table", fromsec) &&
1330                             r_type == R_RISCV_SUB32)
1331                                 continue;
1332                         break;
1333                 case EM_LOONGARCH:
1334                         switch (r_type) {
1335                         case R_LARCH_SUB32:
1336                                 if (!strcmp("__ex_table", fromsec))
1337                                         continue;
1338                                 break;
1339                         case R_LARCH_RELAX:
1340                         case R_LARCH_ALIGN:
1341                                 /* These relocs do not refer to symbols */
1342                                 continue;
1343                         }
1344                         break;
1345                 }
1346
1347                 check_section_mismatch(mod, elf, tsym,
1348                                        fsecndx, fromsec, r_offset, taddr);
1349         }
1350 }
1351
1352 static void section_rel(struct module *mod, struct elf_info *elf,
1353                         unsigned int fsecndx, const char *fromsec,
1354                         const Elf_Rel *start, const Elf_Rel *stop)
1355 {
1356         const Elf_Rel *rel;
1357
1358         for (rel = start; rel < stop; rel++) {
1359                 Elf_Sym *tsym;
1360                 Elf_Addr taddr, r_offset;
1361                 unsigned int r_type, r_sym;
1362                 void *loc;
1363
1364                 r_offset = TO_NATIVE(rel->r_offset);
1365                 get_rel_type_and_sym(elf, rel->r_info, &r_type, &r_sym);
1366
1367                 loc = sym_get_data_by_offset(elf, fsecndx, r_offset);
1368                 tsym = elf->symtab_start + r_sym;
1369
1370                 switch (elf->hdr->e_machine) {
1371                 case EM_386:
1372                         taddr = addend_386_rel(loc, r_type);
1373                         break;
1374                 case EM_ARM:
1375                         taddr = addend_arm_rel(loc, tsym, r_type);
1376                         break;
1377                 case EM_MIPS:
1378                         taddr = addend_mips_rel(loc, r_type);
1379                         break;
1380                 default:
1381                         fatal("Please add code to calculate addend for this architecture\n");
1382                 }
1383
1384                 check_section_mismatch(mod, elf, tsym,
1385                                        fsecndx, fromsec, r_offset, taddr);
1386         }
1387 }
1388
1389 /**
1390  * A module includes a number of sections that are discarded
1391  * either when loaded or when used as built-in.
1392  * For loaded modules all functions marked __init and all data
1393  * marked __initdata will be discarded when the module has been initialized.
1394  * Likewise for modules used built-in the sections marked __exit
1395  * are discarded because __exit marked function are supposed to be called
1396  * only when a module is unloaded which never happens for built-in modules.
1397  * The check_sec_ref() function traverses all relocation records
1398  * to find all references to a section that reference a section that will
1399  * be discarded and warns about it.
1400  **/
1401 static void check_sec_ref(struct module *mod, struct elf_info *elf)
1402 {
1403         int i;
1404
1405         /* Walk through all sections */
1406         for (i = 0; i < elf->num_sections; i++) {
1407                 Elf_Shdr *sechdr = &elf->sechdrs[i];
1408
1409                 check_section(mod->name, elf, sechdr);
1410                 /* We want to process only relocation sections and not .init */
1411                 if (sechdr->sh_type == SHT_REL || sechdr->sh_type == SHT_RELA) {
1412                         /* section to which the relocation applies */
1413                         unsigned int secndx = sechdr->sh_info;
1414                         const char *secname = sec_name(elf, secndx);
1415                         const void *start, *stop;
1416
1417                         /* If the section is known good, skip it */
1418                         if (match(secname, section_white_list))
1419                                 continue;
1420
1421                         start = sym_get_data_by_offset(elf, i, 0);
1422                         stop = start + sechdr->sh_size;
1423
1424                         if (sechdr->sh_type == SHT_RELA)
1425                                 section_rela(mod, elf, secndx, secname,
1426                                              start, stop);
1427                         else
1428                                 section_rel(mod, elf, secndx, secname,
1429                                             start, stop);
1430                 }
1431         }
1432 }
1433
1434 static char *remove_dot(char *s)
1435 {
1436         size_t n = strcspn(s, ".");
1437
1438         if (n && s[n]) {
1439                 size_t m = strspn(s + n + 1, "0123456789");
1440                 if (m && (s[n + m + 1] == '.' || s[n + m + 1] == 0))
1441                         s[n] = 0;
1442         }
1443         return s;
1444 }
1445
1446 /*
1447  * The CRCs are recorded in .*.cmd files in the form of:
1448  * #SYMVER <name> <crc>
1449  */
1450 static void extract_crcs_for_object(const char *object, struct module *mod)
1451 {
1452         char cmd_file[PATH_MAX];
1453         char *buf, *p;
1454         const char *base;
1455         int dirlen, ret;
1456
1457         base = strrchr(object, '/');
1458         if (base) {
1459                 base++;
1460                 dirlen = base - object;
1461         } else {
1462                 dirlen = 0;
1463                 base = object;
1464         }
1465
1466         ret = snprintf(cmd_file, sizeof(cmd_file), "%.*s.%s.cmd",
1467                        dirlen, object, base);
1468         if (ret >= sizeof(cmd_file)) {
1469                 error("%s: too long path was truncated\n", cmd_file);
1470                 return;
1471         }
1472
1473         buf = read_text_file(cmd_file);
1474         p = buf;
1475
1476         while ((p = strstr(p, "\n#SYMVER "))) {
1477                 char *name;
1478                 size_t namelen;
1479                 unsigned int crc;
1480                 struct symbol *sym;
1481
1482                 name = p + strlen("\n#SYMVER ");
1483
1484                 p = strchr(name, ' ');
1485                 if (!p)
1486                         break;
1487
1488                 namelen = p - name;
1489                 p++;
1490
1491                 if (!isdigit(*p))
1492                         continue;       /* skip this line */
1493
1494                 crc = strtoul(p, &p, 0);
1495                 if (*p != '\n')
1496                         continue;       /* skip this line */
1497
1498                 name[namelen] = '\0';
1499
1500                 /*
1501                  * sym_find_with_module() may return NULL here.
1502                  * It typically occurs when CONFIG_TRIM_UNUSED_KSYMS=y.
1503                  * Since commit e1327a127703, genksyms calculates CRCs of all
1504                  * symbols, including trimmed ones. Ignore orphan CRCs.
1505                  */
1506                 sym = sym_find_with_module(name, mod);
1507                 if (sym)
1508                         sym_set_crc(sym, crc);
1509         }
1510
1511         free(buf);
1512 }
1513
1514 /*
1515  * The symbol versions (CRC) are recorded in the .*.cmd files.
1516  * Parse them to retrieve CRCs for the current module.
1517  */
1518 static void mod_set_crcs(struct module *mod)
1519 {
1520         char objlist[PATH_MAX];
1521         char *buf, *p, *obj;
1522         int ret;
1523
1524         if (mod->is_vmlinux) {
1525                 strcpy(objlist, ".vmlinux.objs");
1526         } else {
1527                 /* objects for a module are listed in the *.mod file. */
1528                 ret = snprintf(objlist, sizeof(objlist), "%s.mod", mod->name);
1529                 if (ret >= sizeof(objlist)) {
1530                         error("%s: too long path was truncated\n", objlist);
1531                         return;
1532                 }
1533         }
1534
1535         buf = read_text_file(objlist);
1536         p = buf;
1537
1538         while ((obj = strsep(&p, "\n")) && obj[0])
1539                 extract_crcs_for_object(obj, mod);
1540
1541         free(buf);
1542 }
1543
1544 static void read_symbols(const char *modname)
1545 {
1546         const char *symname;
1547         char *version;
1548         char *license;
1549         char *namespace;
1550         struct module *mod;
1551         struct elf_info info = { };
1552         Elf_Sym *sym;
1553
1554         if (!parse_elf(&info, modname))
1555                 return;
1556
1557         if (!strends(modname, ".o")) {
1558                 error("%s: filename must be suffixed with .o\n", modname);
1559                 return;
1560         }
1561
1562         /* strip trailing .o */
1563         mod = new_module(modname, strlen(modname) - strlen(".o"));
1564
1565         if (!mod->is_vmlinux) {
1566                 license = get_modinfo(&info, "license");
1567                 if (!license)
1568                         error("missing MODULE_LICENSE() in %s\n", modname);
1569                 while (license) {
1570                         if (!license_is_gpl_compatible(license)) {
1571                                 mod->is_gpl_compatible = false;
1572                                 break;
1573                         }
1574                         license = get_next_modinfo(&info, "license", license);
1575                 }
1576
1577                 namespace = get_modinfo(&info, "import_ns");
1578                 while (namespace) {
1579                         add_namespace(&mod->imported_namespaces, namespace);
1580                         namespace = get_next_modinfo(&info, "import_ns",
1581                                                      namespace);
1582                 }
1583
1584                 if (extra_warn && !get_modinfo(&info, "description"))
1585                         warn("missing MODULE_DESCRIPTION() in %s\n", modname);
1586         }
1587
1588         for (sym = info.symtab_start; sym < info.symtab_stop; sym++) {
1589                 symname = remove_dot(info.strtab + sym->st_name);
1590
1591                 handle_symbol(mod, &info, sym, symname);
1592                 handle_moddevtable(mod, &info, sym, symname);
1593         }
1594
1595         check_sec_ref(mod, &info);
1596
1597         if (!mod->is_vmlinux) {
1598                 version = get_modinfo(&info, "version");
1599                 if (version || all_versions)
1600                         get_src_version(mod->name, mod->srcversion,
1601                                         sizeof(mod->srcversion) - 1);
1602         }
1603
1604         parse_elf_finish(&info);
1605
1606         if (modversions) {
1607                 /*
1608                  * Our trick to get versioning for module struct etc. - it's
1609                  * never passed as an argument to an exported function, so
1610                  * the automatic versioning doesn't pick it up, but it's really
1611                  * important anyhow.
1612                  */
1613                 sym_add_unresolved("module_layout", mod, false);
1614
1615                 mod_set_crcs(mod);
1616         }
1617 }
1618
1619 static void read_symbols_from_files(const char *filename)
1620 {
1621         FILE *in = stdin;
1622         char fname[PATH_MAX];
1623
1624         in = fopen(filename, "r");
1625         if (!in)
1626                 fatal("Can't open filenames file %s: %m", filename);
1627
1628         while (fgets(fname, PATH_MAX, in) != NULL) {
1629                 if (strends(fname, "\n"))
1630                         fname[strlen(fname)-1] = '\0';
1631                 read_symbols(fname);
1632         }
1633
1634         fclose(in);
1635 }
1636
1637 #define SZ 500
1638
1639 /* We first write the generated file into memory using the
1640  * following helper, then compare to the file on disk and
1641  * only update the later if anything changed */
1642
1643 void __attribute__((format(printf, 2, 3))) buf_printf(struct buffer *buf,
1644                                                       const char *fmt, ...)
1645 {
1646         char tmp[SZ];
1647         int len;
1648         va_list ap;
1649
1650         va_start(ap, fmt);
1651         len = vsnprintf(tmp, SZ, fmt, ap);
1652         buf_write(buf, tmp, len);
1653         va_end(ap);
1654 }
1655
1656 void buf_write(struct buffer *buf, const char *s, int len)
1657 {
1658         if (buf->size - buf->pos < len) {
1659                 buf->size += len + SZ;
1660                 buf->p = xrealloc(buf->p, buf->size);
1661         }
1662         strncpy(buf->p + buf->pos, s, len);
1663         buf->pos += len;
1664 }
1665
1666 static void check_exports(struct module *mod)
1667 {
1668         struct symbol *s, *exp;
1669
1670         list_for_each_entry(s, &mod->unresolved_symbols, list) {
1671                 const char *basename;
1672                 exp = find_symbol(s->name);
1673                 if (!exp) {
1674                         if (!s->weak && nr_unresolved++ < MAX_UNRESOLVED_REPORTS)
1675                                 modpost_log(!warn_unresolved,
1676                                             "\"%s\" [%s.ko] undefined!\n",
1677                                             s->name, mod->name);
1678                         continue;
1679                 }
1680                 if (exp->module == mod) {
1681                         error("\"%s\" [%s.ko] was exported without definition\n",
1682                               s->name, mod->name);
1683                         continue;
1684                 }
1685
1686                 exp->used = true;
1687                 s->module = exp->module;
1688                 s->crc_valid = exp->crc_valid;
1689                 s->crc = exp->crc;
1690
1691                 basename = strrchr(mod->name, '/');
1692                 if (basename)
1693                         basename++;
1694                 else
1695                         basename = mod->name;
1696
1697                 if (!contains_namespace(&mod->imported_namespaces, exp->namespace)) {
1698                         modpost_log(!allow_missing_ns_imports,
1699                                     "module %s uses symbol %s from namespace %s, but does not import it.\n",
1700                                     basename, exp->name, exp->namespace);
1701                         add_namespace(&mod->missing_namespaces, exp->namespace);
1702                 }
1703
1704                 if (!mod->is_gpl_compatible && exp->is_gpl_only)
1705                         error("GPL-incompatible module %s.ko uses GPL-only symbol '%s'\n",
1706                               basename, exp->name);
1707         }
1708 }
1709
1710 static void handle_white_list_exports(const char *white_list)
1711 {
1712         char *buf, *p, *name;
1713
1714         buf = read_text_file(white_list);
1715         p = buf;
1716
1717         while ((name = strsep(&p, "\n"))) {
1718                 struct symbol *sym = find_symbol(name);
1719
1720                 if (sym)
1721                         sym->used = true;
1722         }
1723
1724         free(buf);
1725 }
1726
1727 static void check_modname_len(struct module *mod)
1728 {
1729         const char *mod_name;
1730
1731         mod_name = strrchr(mod->name, '/');
1732         if (mod_name == NULL)
1733                 mod_name = mod->name;
1734         else
1735                 mod_name++;
1736         if (strlen(mod_name) >= MODULE_NAME_LEN)
1737                 error("module name is too long [%s.ko]\n", mod->name);
1738 }
1739
1740 /**
1741  * Header for the generated file
1742  **/
1743 static void add_header(struct buffer *b, struct module *mod)
1744 {
1745         buf_printf(b, "#include <linux/module.h>\n");
1746         buf_printf(b, "#include <linux/export-internal.h>\n");
1747         buf_printf(b, "#include <linux/compiler.h>\n");
1748         buf_printf(b, "\n");
1749         buf_printf(b, "MODULE_INFO(name, KBUILD_MODNAME);\n");
1750         buf_printf(b, "\n");
1751         buf_printf(b, "__visible struct module __this_module\n");
1752         buf_printf(b, "__section(\".gnu.linkonce.this_module\") = {\n");
1753         buf_printf(b, "\t.name = KBUILD_MODNAME,\n");
1754         if (mod->has_init)
1755                 buf_printf(b, "\t.init = init_module,\n");
1756         if (mod->has_cleanup)
1757                 buf_printf(b, "#ifdef CONFIG_MODULE_UNLOAD\n"
1758                               "\t.exit = cleanup_module,\n"
1759                               "#endif\n");
1760         buf_printf(b, "\t.arch = MODULE_ARCH_INIT,\n");
1761         buf_printf(b, "};\n");
1762
1763         if (!external_module)
1764                 buf_printf(b, "\nMODULE_INFO(intree, \"Y\");\n");
1765
1766         if (strstarts(mod->name, "drivers/staging"))
1767                 buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n");
1768
1769         if (strstarts(mod->name, "tools/testing"))
1770                 buf_printf(b, "\nMODULE_INFO(test, \"Y\");\n");
1771 }
1772
1773 static void add_exported_symbols(struct buffer *buf, struct module *mod)
1774 {
1775         struct symbol *sym;
1776
1777         /* generate struct for exported symbols */
1778         buf_printf(buf, "\n");
1779         list_for_each_entry(sym, &mod->exported_symbols, list) {
1780                 if (trim_unused_exports && !sym->used)
1781                         continue;
1782
1783                 buf_printf(buf, "KSYMTAB_%s(%s, \"%s\", \"%s\");\n",
1784                            sym->is_func ? "FUNC" : "DATA", sym->name,
1785                            sym->is_gpl_only ? "_gpl" : "", sym->namespace);
1786         }
1787
1788         if (!modversions)
1789                 return;
1790
1791         /* record CRCs for exported symbols */
1792         buf_printf(buf, "\n");
1793         list_for_each_entry(sym, &mod->exported_symbols, list) {
1794                 if (trim_unused_exports && !sym->used)
1795                         continue;
1796
1797                 if (!sym->crc_valid)
1798                         warn("EXPORT symbol \"%s\" [%s%s] version generation failed, symbol will not be versioned.\n"
1799                              "Is \"%s\" prototyped in <asm/asm-prototypes.h>?\n",
1800                              sym->name, mod->name, mod->is_vmlinux ? "" : ".ko",
1801                              sym->name);
1802
1803                 buf_printf(buf, "SYMBOL_CRC(%s, 0x%08x, \"%s\");\n",
1804                            sym->name, sym->crc, sym->is_gpl_only ? "_gpl" : "");
1805         }
1806 }
1807
1808 /**
1809  * Record CRCs for unresolved symbols
1810  **/
1811 static void add_versions(struct buffer *b, struct module *mod)
1812 {
1813         struct symbol *s;
1814
1815         if (!modversions)
1816                 return;
1817
1818         buf_printf(b, "\n");
1819         buf_printf(b, "static const struct modversion_info ____versions[]\n");
1820         buf_printf(b, "__used __section(\"__versions\") = {\n");
1821
1822         list_for_each_entry(s, &mod->unresolved_symbols, list) {
1823                 if (!s->module)
1824                         continue;
1825                 if (!s->crc_valid) {
1826                         warn("\"%s\" [%s.ko] has no CRC!\n",
1827                                 s->name, mod->name);
1828                         continue;
1829                 }
1830                 if (strlen(s->name) >= MODULE_NAME_LEN) {
1831                         error("too long symbol \"%s\" [%s.ko]\n",
1832                               s->name, mod->name);
1833                         break;
1834                 }
1835                 buf_printf(b, "\t{ %#8x, \"%s\" },\n",
1836                            s->crc, s->name);
1837         }
1838
1839         buf_printf(b, "};\n");
1840 }
1841
1842 static void add_depends(struct buffer *b, struct module *mod)
1843 {
1844         struct symbol *s;
1845         int first = 1;
1846
1847         /* Clear ->seen flag of modules that own symbols needed by this. */
1848         list_for_each_entry(s, &mod->unresolved_symbols, list) {
1849                 if (s->module)
1850                         s->module->seen = s->module->is_vmlinux;
1851         }
1852
1853         buf_printf(b, "\n");
1854         buf_printf(b, "MODULE_INFO(depends, \"");
1855         list_for_each_entry(s, &mod->unresolved_symbols, list) {
1856                 const char *p;
1857                 if (!s->module)
1858                         continue;
1859
1860                 if (s->module->seen)
1861                         continue;
1862
1863                 s->module->seen = true;
1864                 p = strrchr(s->module->name, '/');
1865                 if (p)
1866                         p++;
1867                 else
1868                         p = s->module->name;
1869                 buf_printf(b, "%s%s", first ? "" : ",", p);
1870                 first = 0;
1871         }
1872         buf_printf(b, "\");\n");
1873 }
1874
1875 static void add_srcversion(struct buffer *b, struct module *mod)
1876 {
1877         if (mod->srcversion[0]) {
1878                 buf_printf(b, "\n");
1879                 buf_printf(b, "MODULE_INFO(srcversion, \"%s\");\n",
1880                            mod->srcversion);
1881         }
1882 }
1883
1884 static void write_buf(struct buffer *b, const char *fname)
1885 {
1886         FILE *file;
1887
1888         if (error_occurred)
1889                 return;
1890
1891         file = fopen(fname, "w");
1892         if (!file) {
1893                 perror(fname);
1894                 exit(1);
1895         }
1896         if (fwrite(b->p, 1, b->pos, file) != b->pos) {
1897                 perror(fname);
1898                 exit(1);
1899         }
1900         if (fclose(file) != 0) {
1901                 perror(fname);
1902                 exit(1);
1903         }
1904 }
1905
1906 static void write_if_changed(struct buffer *b, const char *fname)
1907 {
1908         char *tmp;
1909         FILE *file;
1910         struct stat st;
1911
1912         file = fopen(fname, "r");
1913         if (!file)
1914                 goto write;
1915
1916         if (fstat(fileno(file), &st) < 0)
1917                 goto close_write;
1918
1919         if (st.st_size != b->pos)
1920                 goto close_write;
1921
1922         tmp = xmalloc(b->pos);
1923         if (fread(tmp, 1, b->pos, file) != b->pos)
1924                 goto free_write;
1925
1926         if (memcmp(tmp, b->p, b->pos) != 0)
1927                 goto free_write;
1928
1929         free(tmp);
1930         fclose(file);
1931         return;
1932
1933  free_write:
1934         free(tmp);
1935  close_write:
1936         fclose(file);
1937  write:
1938         write_buf(b, fname);
1939 }
1940
1941 static void write_vmlinux_export_c_file(struct module *mod)
1942 {
1943         struct buffer buf = { };
1944
1945         buf_printf(&buf,
1946                    "#include <linux/export-internal.h>\n");
1947
1948         add_exported_symbols(&buf, mod);
1949         write_if_changed(&buf, ".vmlinux.export.c");
1950         free(buf.p);
1951 }
1952
1953 /* do sanity checks, and generate *.mod.c file */
1954 static void write_mod_c_file(struct module *mod)
1955 {
1956         struct buffer buf = { };
1957         struct module_alias *alias, *next;
1958         char fname[PATH_MAX];
1959         int ret;
1960
1961         add_header(&buf, mod);
1962         add_exported_symbols(&buf, mod);
1963         add_versions(&buf, mod);
1964         add_depends(&buf, mod);
1965
1966         buf_printf(&buf, "\n");
1967         list_for_each_entry_safe(alias, next, &mod->aliases, node) {
1968                 buf_printf(&buf, "MODULE_ALIAS(\"%s\");\n", alias->str);
1969                 list_del(&alias->node);
1970                 free(alias);
1971         }
1972
1973         add_srcversion(&buf, mod);
1974
1975         ret = snprintf(fname, sizeof(fname), "%s.mod.c", mod->name);
1976         if (ret >= sizeof(fname)) {
1977                 error("%s: too long path was truncated\n", fname);
1978                 goto free;
1979         }
1980
1981         write_if_changed(&buf, fname);
1982
1983 free:
1984         free(buf.p);
1985 }
1986
1987 /* parse Module.symvers file. line format:
1988  * 0x12345678<tab>symbol<tab>module<tab>export<tab>namespace
1989  **/
1990 static void read_dump(const char *fname)
1991 {
1992         char *buf, *pos, *line;
1993
1994         buf = read_text_file(fname);
1995         if (!buf)
1996                 /* No symbol versions, silently ignore */
1997                 return;
1998
1999         pos = buf;
2000
2001         while ((line = get_line(&pos))) {
2002                 char *symname, *namespace, *modname, *d, *export;
2003                 unsigned int crc;
2004                 struct module *mod;
2005                 struct symbol *s;
2006                 bool gpl_only;
2007
2008                 if (!(symname = strchr(line, '\t')))
2009                         goto fail;
2010                 *symname++ = '\0';
2011                 if (!(modname = strchr(symname, '\t')))
2012                         goto fail;
2013                 *modname++ = '\0';
2014                 if (!(export = strchr(modname, '\t')))
2015                         goto fail;
2016                 *export++ = '\0';
2017                 if (!(namespace = strchr(export, '\t')))
2018                         goto fail;
2019                 *namespace++ = '\0';
2020
2021                 crc = strtoul(line, &d, 16);
2022                 if (*symname == '\0' || *modname == '\0' || *d != '\0')
2023                         goto fail;
2024
2025                 if (!strcmp(export, "EXPORT_SYMBOL_GPL")) {
2026                         gpl_only = true;
2027                 } else if (!strcmp(export, "EXPORT_SYMBOL")) {
2028                         gpl_only = false;
2029                 } else {
2030                         error("%s: unknown license %s. skip", symname, export);
2031                         continue;
2032                 }
2033
2034                 mod = find_module(fname, modname);
2035                 if (!mod) {
2036                         mod = new_module(modname, strlen(modname));
2037                         mod->dump_file = fname;
2038                 }
2039                 s = sym_add_exported(symname, mod, gpl_only, namespace);
2040                 sym_set_crc(s, crc);
2041         }
2042         free(buf);
2043         return;
2044 fail:
2045         free(buf);
2046         fatal("parse error in symbol dump file\n");
2047 }
2048
2049 static void write_dump(const char *fname)
2050 {
2051         struct buffer buf = { };
2052         struct module *mod;
2053         struct symbol *sym;
2054
2055         list_for_each_entry(mod, &modules, list) {
2056                 if (mod->dump_file)
2057                         continue;
2058                 list_for_each_entry(sym, &mod->exported_symbols, list) {
2059                         if (trim_unused_exports && !sym->used)
2060                                 continue;
2061
2062                         buf_printf(&buf, "0x%08x\t%s\t%s\tEXPORT_SYMBOL%s\t%s\n",
2063                                    sym->crc, sym->name, mod->name,
2064                                    sym->is_gpl_only ? "_GPL" : "",
2065                                    sym->namespace);
2066                 }
2067         }
2068         write_buf(&buf, fname);
2069         free(buf.p);
2070 }
2071
2072 static void write_namespace_deps_files(const char *fname)
2073 {
2074         struct module *mod;
2075         struct namespace_list *ns;
2076         struct buffer ns_deps_buf = {};
2077
2078         list_for_each_entry(mod, &modules, list) {
2079
2080                 if (mod->dump_file || list_empty(&mod->missing_namespaces))
2081                         continue;
2082
2083                 buf_printf(&ns_deps_buf, "%s.ko:", mod->name);
2084
2085                 list_for_each_entry(ns, &mod->missing_namespaces, list)
2086                         buf_printf(&ns_deps_buf, " %s", ns->namespace);
2087
2088                 buf_printf(&ns_deps_buf, "\n");
2089         }
2090
2091         write_if_changed(&ns_deps_buf, fname);
2092         free(ns_deps_buf.p);
2093 }
2094
2095 struct dump_list {
2096         struct list_head list;
2097         const char *file;
2098 };
2099
2100 static void check_host_endian(void)
2101 {
2102         static const union {
2103                 short s;
2104                 char c[2];
2105         } endian_test = { .c = {0x01, 0x02} };
2106
2107         switch (endian_test.s) {
2108         case 0x0102:
2109                 host_is_big_endian = true;
2110                 break;
2111         case 0x0201:
2112                 host_is_big_endian = false;
2113                 break;
2114         default:
2115                 fatal("Unknown host endian\n");
2116         }
2117 }
2118
2119 int main(int argc, char **argv)
2120 {
2121         struct module *mod;
2122         char *missing_namespace_deps = NULL;
2123         char *unused_exports_white_list = NULL;
2124         char *dump_write = NULL, *files_source = NULL;
2125         int opt;
2126         LIST_HEAD(dump_lists);
2127         struct dump_list *dl, *dl2;
2128
2129         while ((opt = getopt(argc, argv, "ei:MmnT:to:au:WwENd:")) != -1) {
2130                 switch (opt) {
2131                 case 'e':
2132                         external_module = true;
2133                         break;
2134                 case 'i':
2135                         dl = xmalloc(sizeof(*dl));
2136                         dl->file = optarg;
2137                         list_add_tail(&dl->list, &dump_lists);
2138                         break;
2139                 case 'M':
2140                         module_enabled = true;
2141                         break;
2142                 case 'm':
2143                         modversions = true;
2144                         break;
2145                 case 'n':
2146                         ignore_missing_files = true;
2147                         break;
2148                 case 'o':
2149                         dump_write = optarg;
2150                         break;
2151                 case 'a':
2152                         all_versions = true;
2153                         break;
2154                 case 'T':
2155                         files_source = optarg;
2156                         break;
2157                 case 't':
2158                         trim_unused_exports = true;
2159                         break;
2160                 case 'u':
2161                         unused_exports_white_list = optarg;
2162                         break;
2163                 case 'W':
2164                         extra_warn = true;
2165                         break;
2166                 case 'w':
2167                         warn_unresolved = true;
2168                         break;
2169                 case 'E':
2170                         sec_mismatch_warn_only = false;
2171                         break;
2172                 case 'N':
2173                         allow_missing_ns_imports = true;
2174                         break;
2175                 case 'd':
2176                         missing_namespace_deps = optarg;
2177                         break;
2178                 default:
2179                         exit(1);
2180                 }
2181         }
2182
2183         check_host_endian();
2184
2185         list_for_each_entry_safe(dl, dl2, &dump_lists, list) {
2186                 read_dump(dl->file);
2187                 list_del(&dl->list);
2188                 free(dl);
2189         }
2190
2191         while (optind < argc)
2192                 read_symbols(argv[optind++]);
2193
2194         if (files_source)
2195                 read_symbols_from_files(files_source);
2196
2197         list_for_each_entry(mod, &modules, list) {
2198                 if (mod->dump_file || mod->is_vmlinux)
2199                         continue;
2200
2201                 check_modname_len(mod);
2202                 check_exports(mod);
2203         }
2204
2205         if (unused_exports_white_list)
2206                 handle_white_list_exports(unused_exports_white_list);
2207
2208         list_for_each_entry(mod, &modules, list) {
2209                 if (mod->dump_file)
2210                         continue;
2211
2212                 if (mod->is_vmlinux)
2213                         write_vmlinux_export_c_file(mod);
2214                 else
2215                         write_mod_c_file(mod);
2216         }
2217
2218         if (missing_namespace_deps)
2219                 write_namespace_deps_files(missing_namespace_deps);
2220
2221         if (dump_write)
2222                 write_dump(dump_write);
2223         if (sec_mismatch_count && !sec_mismatch_warn_only)
2224                 error("Section mismatches detected.\n"
2225                       "Set CONFIG_SECTION_MISMATCH_WARN_ONLY=y to allow them.\n");
2226
2227         if (nr_unresolved > MAX_UNRESOLVED_REPORTS)
2228                 warn("suppressed %u unresolved symbol warnings because there were too many)\n",
2229                      nr_unresolved - MAX_UNRESOLVED_REPORTS);
2230
2231         return error_occurred ? 1 : 0;
2232 }
This page took 0.154146 seconds and 4 git commands to generate.