Commit 50c36504 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'modules-next-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux

Pull module updates from Rusty Russell:
 "Nothing exciting, minor tweaks and cleanups"

* tag 'modules-next-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux:
  scripts: [modpost] add new sections to white list
  modpost: Add flag -E for making section mismatches fatal
  params: don't ignore the rest of cmdline if parse_one() fails
  modpost: abort if a module symbol is too long
parents ce5c2d2c d1189c63
...@@ -223,7 +223,7 @@ char *parse_args(const char *doing, ...@@ -223,7 +223,7 @@ char *parse_args(const char *doing,
int (*unknown)(char *param, char *val, int (*unknown)(char *param, char *val,
const char *doing, void *arg)) const char *doing, void *arg))
{ {
char *param, *val; char *param, *val, *err = NULL;
/* Chew leading spaces */ /* Chew leading spaces */
args = skip_spaces(args); args = skip_spaces(args);
...@@ -238,7 +238,7 @@ char *parse_args(const char *doing, ...@@ -238,7 +238,7 @@ char *parse_args(const char *doing,
args = next_arg(args, &param, &val); args = next_arg(args, &param, &val);
/* Stop at -- */ /* Stop at -- */
if (!val && strcmp(param, "--") == 0) if (!val && strcmp(param, "--") == 0)
return args; return err ?: args;
irq_was_disabled = irqs_disabled(); irq_was_disabled = irqs_disabled();
ret = parse_one(param, val, doing, params, num, ret = parse_one(param, val, doing, params, num,
min_level, max_level, arg, unknown); min_level, max_level, arg, unknown);
...@@ -247,24 +247,25 @@ char *parse_args(const char *doing, ...@@ -247,24 +247,25 @@ char *parse_args(const char *doing,
doing, param); doing, param);
switch (ret) { switch (ret) {
case 0:
continue;
case -ENOENT: case -ENOENT:
pr_err("%s: Unknown parameter `%s'\n", doing, param); pr_err("%s: Unknown parameter `%s'\n", doing, param);
return ERR_PTR(ret); break;
case -ENOSPC: case -ENOSPC:
pr_err("%s: `%s' too large for parameter `%s'\n", pr_err("%s: `%s' too large for parameter `%s'\n",
doing, val ?: "", param); doing, val ?: "", param);
return ERR_PTR(ret);
case 0:
break; break;
default: default:
pr_err("%s: `%s' invalid for parameter `%s'\n", pr_err("%s: `%s' invalid for parameter `%s'\n",
doing, val ?: "", param); doing, val ?: "", param);
return ERR_PTR(ret); break;
} }
err = ERR_PTR(ret);
} }
/* All parsed OK. */ return err;
return NULL;
} }
/* Lazy bastard, eh? */ /* Lazy bastard, eh? */
......
...@@ -312,6 +312,15 @@ config DEBUG_SECTION_MISMATCH ...@@ -312,6 +312,15 @@ config DEBUG_SECTION_MISMATCH
- Enable verbose reporting from modpost in order to help resolve - Enable verbose reporting from modpost in order to help resolve
the section mismatches that are reported. the section mismatches that are reported.
config SECTION_MISMATCH_WARN_ONLY
bool "Make section mismatch errors non-fatal"
default y
help
If you say N here, the build process will fail if there are any
section mismatch, instead of just throwing warnings.
If unsure, say Y.
# #
# Select this config option from the architecture Kconfig, if it # Select this config option from the architecture Kconfig, if it
# is preferred to always offer frame pointers as a config # is preferred to always offer frame pointers as a config
......
...@@ -77,6 +77,7 @@ modpost = scripts/mod/modpost \ ...@@ -77,6 +77,7 @@ modpost = scripts/mod/modpost \
$(if $(KBUILD_EXTRA_SYMBOLS), $(patsubst %, -e %,$(KBUILD_EXTRA_SYMBOLS))) \ $(if $(KBUILD_EXTRA_SYMBOLS), $(patsubst %, -e %,$(KBUILD_EXTRA_SYMBOLS))) \
$(if $(KBUILD_EXTMOD),-o $(modulesymfile)) \ $(if $(KBUILD_EXTMOD),-o $(modulesymfile)) \
$(if $(CONFIG_DEBUG_SECTION_MISMATCH),,-S) \ $(if $(CONFIG_DEBUG_SECTION_MISMATCH),,-S) \
$(if $(CONFIG_SECTION_MISMATCH_WARN_ONLY),,-E) \
$(if $(KBUILD_EXTMOD)$(KBUILD_MODPOST_WARN),-w) $(if $(KBUILD_EXTMOD)$(KBUILD_MODPOST_WARN),-w)
MODPOST_OPT=$(subst -i,-n,$(filter -i,$(MAKEFLAGS))) MODPOST_OPT=$(subst -i,-n,$(filter -i,$(MAKEFLAGS)))
......
...@@ -38,6 +38,7 @@ static int warn_unresolved = 0; ...@@ -38,6 +38,7 @@ static int warn_unresolved = 0;
/* How a symbol is exported */ /* How a symbol is exported */
static int sec_mismatch_count = 0; static int sec_mismatch_count = 0;
static int sec_mismatch_verbose = 1; static int sec_mismatch_verbose = 1;
static int sec_mismatch_fatal = 0;
/* ignore missing files */ /* ignore missing files */
static int ignore_missing_files; static int ignore_missing_files;
...@@ -833,6 +834,8 @@ static const char *const section_white_list[] = ...@@ -833,6 +834,8 @@ static const char *const section_white_list[] =
".xt.lit", /* xtensa */ ".xt.lit", /* xtensa */
".arcextmap*", /* arc */ ".arcextmap*", /* arc */
".gnu.linkonce.arcext*", /* arc : modules */ ".gnu.linkonce.arcext*", /* arc : modules */
".cmem*", /* EZchip */
".fmt_slot*", /* EZchip */
".gnu.lto*", ".gnu.lto*",
NULL NULL
}; };
...@@ -2133,6 +2136,11 @@ static void add_staging_flag(struct buffer *b, const char *name) ...@@ -2133,6 +2136,11 @@ static void add_staging_flag(struct buffer *b, const char *name)
buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n"); buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n");
} }
/* In kernel, this size is defined in linux/module.h;
* here we use Elf_Addr instead of long for covering cross-compile
*/
#define MODULE_NAME_LEN (64 - sizeof(Elf_Addr))
/** /**
* Record CRCs for unresolved symbols * Record CRCs for unresolved symbols
**/ **/
...@@ -2177,6 +2185,12 @@ static int add_versions(struct buffer *b, struct module *mod) ...@@ -2177,6 +2185,12 @@ static int add_versions(struct buffer *b, struct module *mod)
s->name, mod->name); s->name, mod->name);
continue; continue;
} }
if (strlen(s->name) >= MODULE_NAME_LEN) {
merror("too long symbol \"%s\" [%s.ko]\n",
s->name, mod->name);
err = 1;
break;
}
buf_printf(b, "\t{ %#8x, __VMLINUX_SYMBOL_STR(%s) },\n", buf_printf(b, "\t{ %#8x, __VMLINUX_SYMBOL_STR(%s) },\n",
s->crc, s->name); s->crc, s->name);
} }
...@@ -2374,7 +2388,7 @@ int main(int argc, char **argv) ...@@ -2374,7 +2388,7 @@ int main(int argc, char **argv)
struct ext_sym_list *extsym_iter; struct ext_sym_list *extsym_iter;
struct ext_sym_list *extsym_start = NULL; 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) { switch (opt) {
case 'i': case 'i':
kernel_read = optarg; kernel_read = optarg;
...@@ -2415,6 +2429,9 @@ int main(int argc, char **argv) ...@@ -2415,6 +2429,9 @@ int main(int argc, char **argv)
case 'w': case 'w':
warn_unresolved = 1; warn_unresolved = 1;
break; break;
case 'E':
sec_mismatch_fatal = 1;
break;
default: default:
exit(1); exit(1);
} }
...@@ -2464,14 +2481,20 @@ int main(int argc, char **argv) ...@@ -2464,14 +2481,20 @@ int main(int argc, char **argv)
sprintf(fname, "%s.mod.c", mod->name); sprintf(fname, "%s.mod.c", mod->name);
write_if_changed(&buf, fname); write_if_changed(&buf, fname);
} }
if (dump_write) if (dump_write)
write_dump(dump_write); write_dump(dump_write);
if (sec_mismatch_count && !sec_mismatch_verbose) if (sec_mismatch_count) {
warn("modpost: Found %d section mismatch(es).\n" if (!sec_mismatch_verbose) {
"To see full details build your kernel with:\n" warn("modpost: Found %d section mismatch(es).\n"
"'make CONFIG_DEBUG_SECTION_MISMATCH=y'\n", "To see full details build your kernel with:\n"
sec_mismatch_count); "'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; return err;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment