History

modpost: Add flag -E for making section mismatches fatal

The section mismatch warning can be easy to miss during the kernel build process. Allow it to be marked as fatal to be easily caught and prevent bugs from slipping in. Setting CONFIG_SECTION_MISMATCH_WARN_ONLY=y causes these warnings to be non-fatal, since there are a number of section mismatches when using allmodconfig on some architectures, and we do not want to break these builds by default.

Nicolas Boichat committed 11 years ago

Commit 47490ec1 parent 74b22c43 files · +27 −7Browse files

Unified · Split

3 files
  1. lib/Kconfig.debug +9 −0
  2. scripts/Makefile.modpost +1 −0
  3. scripts/mod/modpost.c +17 −7
lib/Kconfig.debug+9−0
@@ -311,6 +311,15 @@ config DEBUG_SECTION_MISMATCH · 310 unmodified lines
311 - Enable verbose reporting from modpost in order to help resolve311 - Enable verbose reporting from modpost in order to help resolve
312 the section mismatches that are reported.312 the section mismatches that are reported.
313 313
314config SECTION_MISMATCH_WARN_ONLY
315 bool "Make section mismatch errors non-fatal"
316 default y
317 help
318 If you say N here, the build process will fail if there are any
319 section mismatch, instead of just throwing warnings.
320
321 If unsure, say Y.
322
314#323#
315# Select this config option from the architecture Kconfig, if it324# Select this config option from the architecture Kconfig, if it
316# is preferred to always offer frame pointers as a config325# is preferred to always offer frame pointers as a config
scripts/Makefile.modpost+1−0
@@ -77,6 +77,7 @@ modpost = scripts/mod/modpost \ · 76 unmodified lines
77 $(if $(KBUILD_EXTRA_SYMBOLS), $(patsubst %, -e %,$(KBUILD_EXTRA_SYMBOLS))) \77 $(if $(KBUILD_EXTRA_SYMBOLS), $(patsubst %, -e %,$(KBUILD_EXTRA_SYMBOLS))) \
78 $(if $(KBUILD_EXTMOD),-o $(modulesymfile)) \78 $(if $(KBUILD_EXTMOD),-o $(modulesymfile)) \
79 $(if $(CONFIG_DEBUG_SECTION_MISMATCH),,-S) \79 $(if $(CONFIG_DEBUG_SECTION_MISMATCH),,-S) \
80 $(if $(CONFIG_SECTION_MISMATCH_WARN_ONLY),,-E) \
80 $(if $(KBUILD_EXTMOD)$(KBUILD_MODPOST_WARN),-w)81 $(if $(KBUILD_EXTMOD)$(KBUILD_MODPOST_WARN),-w)
81 82
82MODPOST_OPT=$(subst -i,-n,$(filter -i,$(MAKEFLAGS)))83MODPOST_OPT=$(subst -i,-n,$(filter -i,$(MAKEFLAGS)))
scripts/mod/modpost.c+17−7
@@ -38,6 +38,7 @@ static int warn_unresolved = 0; · 37 unmodified lines
38/* How a symbol is exported */38/* How a symbol is exported */
39static int sec_mismatch_count = 0;39static int sec_mismatch_count = 0;
40static int sec_mismatch_verbose = 1;40static int sec_mismatch_verbose = 1;
41static int sec_mismatch_fatal = 0;
41/* ignore missing files */42/* ignore missing files */
42static int ignore_missing_files;43static int ignore_missing_files;
43 44
@@ -2385,7 +2386,7 @@ int main(int argc, char **argv) · 2341 unmodified lines
2385 struct ext_sym_list *extsym_iter;2386 struct ext_sym_list *extsym_iter;
2386 struct ext_sym_list *extsym_start = NULL;2387 struct ext_sym_list *extsym_start = NULL;
2387 2388
2388 while ((opt = getopt(argc, argv, "i:I:e:mnsST:o:awM:K:")) != -1) {2389 while ((opt = getopt(argc, argv, "i:I:e:mnsST:o:awM:K:E")) != -1) {
2389 switch (opt) {2390 switch (opt) {
2390 case 'i':2391 case 'i':
2391 kernel_read = optarg;2392 kernel_read = optarg;
@@ -2426,6 +2427,9 @@ int main(int argc, char **argv) · 34 unmodified lines
2426 case 'w':2427 case 'w':
2427 warn_unresolved = 1;2428 warn_unresolved = 1;
2428 break;2429 break;
2430 case 'E':
2431 sec_mismatch_fatal = 1;
2432 break;
2429 default:2433 default:
2430 exit(1);2434 exit(1);
2431 }2435 }
@@ -2475,14 +2479,20 @@ int main(int argc, char **argv) · 43 unmodified lines
2475 sprintf(fname, "%s.mod.c", mod->name);2479 sprintf(fname, "%s.mod.c", mod->name);
2476 write_if_changed(&buf, fname);2480 write_if_changed(&buf, fname);
2477 }2481 }
2478
2479 if (dump_write)2482 if (dump_write)
2480 write_dump(dump_write);2483 write_dump(dump_write);
2481 if (sec_mismatch_count && !sec_mismatch_verbose)2484 if (sec_mismatch_count) {
2482 warn("modpost: Found %d section mismatch(es).\n"2485 if (!sec_mismatch_verbose) {
2483 "To see full details build your kernel with:\n"2486 warn("modpost: Found %d section mismatch(es).\n"
2484 "'make CONFIG_DEBUG_SECTION_MISMATCH=y'\n",2487 "To see full details build your kernel with:\n"
2485 sec_mismatch_count);2488 "'make CONFIG_DEBUG_SECTION_MISMATCH=y'\n",
2489 sec_mismatch_count);
2490 }
2491 if (sec_mismatch_fatal) {
2492 fatal("modpost: Section mismatches detected.\n"
2493 "Set CONFIG_SECTION_MISMATCH_WARN_ONLY=y to allow them.\n");
2494 }
2495 }
2486 2496
2487 return err;2497 return err;
2488}2498}