|
@@ -38,6 +38,7 @@ static int warn_unresolved = 0;
|
|
|
/* How a symbol is exported */
|
|
|
static int sec_mismatch_count = 0;
|
|
|
static int sec_mismatch_verbose = 1;
|
|
|
+static int sec_mismatch_fatal = 0;
|
|
|
/* ignore missing files */
|
|
|
static int ignore_missing_files;
|
|
|
|
|
@@ -2385,7 +2386,7 @@ int main(int argc, char **argv)
|
|
|
struct ext_sym_list *extsym_iter;
|
|
|
struct ext_sym_list *extsym_start = NULL;
|
|
|
|
|
|
- while ((opt = getopt(argc, argv, "i:I:e:mnsST:o:awM:K:")) != -1) {
|
|
|
+ while ((opt = getopt(argc, argv, "i:I:e:mnsST:o:awM:K:E")) != -1) {
|
|
|
switch (opt) {
|
|
|
case 'i':
|
|
|
kernel_read = optarg;
|
|
@@ -2426,6 +2427,9 @@ int main(int argc, char **argv)
|
|
|
case 'w':
|
|
|
warn_unresolved = 1;
|
|
|
break;
|
|
|
+ case 'E':
|
|
|
+ sec_mismatch_fatal = 1;
|
|
|
+ break;
|
|
|
default:
|
|
|
exit(1);
|
|
|
}
|
|
@@ -2475,14 +2479,20 @@ int main(int argc, char **argv)
|
|
|
sprintf(fname, "%s.mod.c", mod->name);
|
|
|
write_if_changed(&buf, fname);
|
|
|
}
|
|
|
-
|
|
|
if (dump_write)
|
|
|
write_dump(dump_write);
|
|
|
- if (sec_mismatch_count && !sec_mismatch_verbose)
|
|
|
- warn("modpost: Found %d section mismatch(es).\n"
|
|
|
- "To see full details build your kernel with:\n"
|
|
|
- "'make CONFIG_DEBUG_SECTION_MISMATCH=y'\n",
|
|
|
- sec_mismatch_count);
|
|
|
+ if (sec_mismatch_count) {
|
|
|
+ if (!sec_mismatch_verbose) {
|
|
|
+ warn("modpost: Found %d section mismatch(es).\n"
|
|
|
+ "To see full details build your kernel with:\n"
|
|
|
+ "'make CONFIG_DEBUG_SECTION_MISMATCH=y'\n",
|
|
|
+ sec_mismatch_count);
|
|
|
+ }
|
|
|
+ if (sec_mismatch_fatal) {
|
|
|
+ fatal("modpost: Section mismatches detected.\n"
|
|
|
+ "Set CONFIG_SECTION_MISMATCH_WARN_ONLY=y to allow them.\n");
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
return err;
|
|
|
}
|