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