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