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