mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Jani Nikula <jani.nikula@intel.com>
To: linux-kbuild@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: Nathan Chancellor <nathan@kernel.org>,
	Nicolas Schier <nsc@kernel.org>,
	jani.nikula@intel.com
Subject: [PATCH 2/2] modpost: use mod_warn() and mod_error(), clean up logging
Date: Fri,  7 Aug 2026 19:29:41 +0300	[thread overview]
Message-ID: <17ed1bce5d54fb32533ba83bc83c429cb71adcb0.1786120005.git.jani.nikula@intel.com> (raw)
In-Reply-To: <cover.1786120005.git.jani.nikula@intel.com>

Convert all module name logging to use the mod_warn() and mod_error()
helpers, and pass the module to modpost_log() where used directly, to
always have the module name prefixed in the log message, with .ko suffix
for modules.

Pass struct module *mod around in a few places instead of just
mod->name.

Further unify the logging while at it. Use single quotes instead of
double quotes for symbols, sections, and namespaces. Explicitly state
it's a "symbol" when referencing symbols.

Cc: Nathan Chancellor <nathan@kernel.org>
Cc: Nicolas Schier <nsc@kernel.org>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>

---

Tip: easiest to review by applying and using 'git show --color-words'
---
 scripts/mod/modpost.c | 104 ++++++++++++++++++++----------------------
 1 file changed, 49 insertions(+), 55 deletions(-)

diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index 240b45ff92f8..c2202cb2c434 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -365,9 +365,8 @@ static struct symbol *sym_add_exported(const char *name, struct module *mod,
 	struct symbol *s = find_symbol(name);
 
 	if (s && (!external_module || s->module->is_vmlinux || s->module == mod)) {
-		error("%s: '%s' exported twice. Previous export was in %s%s\n",
-		      mod->name, name, s->module->name,
-		      s->module->is_vmlinux ? "" : ".ko");
+		mod_error(mod, "symbol '%s' exported twice. Previous export was in %s%s\n",
+			  name, s->module->name, s->module->is_vmlinux ? "" : ".ko");
 	}
 
 	s = alloc_symbol(name);
@@ -638,7 +637,7 @@ static void handle_symbol(struct module *mod, struct elf_info *info,
 		if (strstarts(symname, "__gnu_lto_")) {
 			/* Should warn here, but modpost runs before the linker */
 		} else
-			warn("\"%s\" [%s] is COMMON symbol\n", symname, mod->name);
+			mod_warn(mod, "'%s' is COMMON symbol\n", symname);
 		break;
 	case SHN_UNDEF:
 		/* undefined symbol */
@@ -781,7 +780,7 @@ static const char *const section_white_list[] =
  * The cause of this is often a section specified in assembler
  * without "ax" / "aw".
  */
-static void check_section(const char *modname, struct elf_info *elf,
+static void check_section(struct module *mod, struct elf_info *elf,
 			  Elf_Shdr *sechdr)
 {
 	const char *sec = sech_name(elf, sechdr);
@@ -789,11 +788,11 @@ static void check_section(const char *modname, struct elf_info *elf,
 	if (sechdr->sh_type == SHT_PROGBITS &&
 	    !(sechdr->sh_flags & SHF_ALLOC) &&
 	    !match(sec, section_white_list)) {
-		warn("%s (%s): unexpected non-allocatable section.\n"
-		     "Did you forget to use \"ax\"/\"aw\" in a .S file?\n"
-		     "Note that for example <linux/init.h> contains\n"
-		     "section definitions for use in .S files.\n\n",
-		     modname, sec);
+		mod_warn(mod, "unexpected non-allocatable section '%s'.\n"
+			 "Did you forget to use \"ax\"/\"aw\" in a .S file?\n"
+			 "Note that for example <linux/init.h> contains\n"
+			 "section definitions for use in .S files.\n\n",
+			 sec);
 	}
 }
 
@@ -1027,7 +1026,7 @@ static bool is_executable_section(struct elf_info *elf, unsigned int secndx)
 	return (elf->sechdrs[secndx].sh_flags & SHF_EXECINSTR) != 0;
 }
 
-static void default_mismatch_handler(const char *modname, struct elf_info *elf,
+static void default_mismatch_handler(struct module *mod, struct elf_info *elf,
 				     const struct sectioncheck* const mismatch,
 				     Elf_Sym *tsym,
 				     unsigned int fsecndx, const char *fromsec, Elf_Addr faddr,
@@ -1057,10 +1056,10 @@ static void default_mismatch_handler(const char *modname, struct elf_info *elf,
 	 * The format for the reference source:      <symbol_name>+<offset> or <address>
 	 * The format for the reference destination: <symbol_name>          or <address>
 	 */
-	warn("%s: section mismatch in reference: %s%s0x%x (section: %s) -> %s (section: %s)\n",
-	     modname, fromsym, fromsym[0] ? "+" : "",
-	     (unsigned int)(faddr - (fromsym[0] ? from->st_value : 0)),
-	     fromsec, tosym[0] ? tosym : taddr_str, tosec);
+	mod_warn(mod, "section mismatch in reference: %s%s0x%x (section: %s) -> %s (section: %s)\n",
+		 fromsym, fromsym[0] ? "+" : "",
+		 (unsigned int)(faddr - (fromsym[0] ? from->st_value : 0)),
+		 fromsec, tosym[0] ? tosym : taddr_str, tosec);
 
 	if (mismatch->mismatch == EXTABLE_TO_NON_TEXT) {
 		if (match(tosec, mismatch->bad_tosec))
@@ -1069,7 +1068,7 @@ static void default_mismatch_handler(const char *modname, struct elf_info *elf,
 			      "Something is seriously wrong and should be fixed.\n"
 			      "You might get more information about where this is\n"
 			      "coming from by using scripts/check_extable.sh %s\n",
-			      fromsec, (long)faddr, tosec, modname);
+			      fromsec, (long)faddr, tosec, mod->name);
 		else if (is_executable_section(elf, get_secindex(elf, tsym)))
 			warn("The relocation at %s+0x%lx references\n"
 			     "section \"%s\" which is not in the list of\n"
@@ -1099,22 +1098,22 @@ static void check_export_symbol(struct module *mod, struct elf_info *elf,
 	label_name = sym_name(elf, label);
 
 	if (!strstarts(label_name, prefix)) {
-		error("%s: .export_symbol section contains strange symbol '%s'\n",
-		      mod->name, label_name);
+		mod_error(mod, ".export_symbol section contains strange symbol '%s'\n",
+			  label_name);
 		return;
 	}
 
 	if (ELF_ST_BIND(sym->st_info) != STB_GLOBAL &&
 	    ELF_ST_BIND(sym->st_info) != STB_WEAK) {
-		error("%s: local symbol '%s' was exported\n", mod->name,
-		      label_name + strlen(prefix));
+		mod_error(mod, "local symbol '%s' was exported\n",
+			  label_name + strlen(prefix));
 		return;
 	}
 
 	name = sym_name(elf, sym);
 	if (strcmp(label_name + strlen(prefix), name)) {
-		error("%s: .export_symbol section references '%s', but it does not seem to be an export symbol\n",
-		      mod->name, name);
+		mod_error(mod, ".export_symbol section references '%s', but it does not seem to be an export symbol\n",
+			  name);
 		return;
 	}
 
@@ -1124,8 +1123,8 @@ static void check_export_symbol(struct module *mod, struct elf_info *elf,
 	} else if (!strcmp(data, "")) {
 		is_gpl = false;
 	} else {
-		error("%s: unknown license '%s' was specified for '%s'\n",
-		      mod->name, data, name);
+		mod_error(mod, "unknown license '%s' was specified for '%s'\n",
+			  data, name);
 		return;
 	}
 
@@ -1148,11 +1147,11 @@ static void check_export_symbol(struct module *mod, struct elf_info *elf,
 		s->is_func = true;
 
 	if (match(secname, PATTERNS(ALL_INIT_SECTIONS)))
-		warn("%s: %s: EXPORT_SYMBOL used for init symbol. Remove __init or EXPORT_SYMBOL.\n",
-		     mod->name, name);
+		mod_warn(mod, "EXPORT_SYMBOL used for init symbol '%s'. Remove __init or EXPORT_SYMBOL.\n",
+			 name);
 	else if (match(secname, PATTERNS(ALL_EXIT_SECTIONS)))
-		warn("%s: %s: EXPORT_SYMBOL used for exit symbol. Remove __exit or EXPORT_SYMBOL.\n",
-		     mod->name, name);
+		mod_warn(mod, "EXPORT_SYMBOL used for exit symbol '%s'. Remove __exit or EXPORT_SYMBOL.\n",
+			 name);
 }
 
 static void check_section_mismatch(struct module *mod, struct elf_info *elf,
@@ -1172,7 +1171,7 @@ static void check_section_mismatch(struct module *mod, struct elf_info *elf,
 	if (!mismatch)
 		return;
 
-	default_mismatch_handler(mod->name, elf, mismatch, sym,
+	default_mismatch_handler(mod, elf, mismatch, sym,
 				 fsecndx, fromsec, faddr,
 				 tosec, taddr);
 }
@@ -1449,7 +1448,7 @@ static void check_sec_ref(struct module *mod, struct elf_info *elf)
 	for (i = 0; i < elf->num_sections; i++) {
 		Elf_Shdr *sechdr = &elf->sechdrs[i];
 
-		check_section(mod->name, elf, sechdr);
+		check_section(mod, elf, sechdr);
 		/* We want to process only relocation sections and not .init */
 		if (sechdr->sh_type == SHT_REL || sechdr->sh_type == SHT_RELA) {
 			/* section to which the relocation applies */
@@ -1619,7 +1618,7 @@ static void read_symbols(const char *modname)
 	if (!mod->is_vmlinux) {
 		license = get_modinfo(&info, "license");
 		if (!license)
-			error("missing MODULE_LICENSE() in %s\n", modname);
+			mod_error(mod, "missing MODULE_LICENSE()\n");
 		while (license) {
 			if (!license_is_gpl_compatible(license)) {
 				mod->is_gpl_compatible = false;
@@ -1632,14 +1631,14 @@ static void read_symbols(const char *modname)
 		     namespace;
 		     namespace = get_next_modinfo(&info, "import_ns", namespace)) {
 			if (strstarts(namespace, MODULE_NS_PREFIX))
-				error("%s: explicitly importing namespace \"%s\" is not allowed.\n",
-				      mod->name, namespace);
+				mod_error(mod, "explicitly importing namespace '%s' is not allowed.\n",
+					  namespace);
 
 			add_namespace(&mod->imported_namespaces, namespace);
 		}
 
 		if (!get_modinfo(&info, "description"))
-			warn("missing MODULE_DESCRIPTION() in %s\n", modname);
+			mod_warn(mod, "missing MODULE_DESCRIPTION()\n");
 	}
 
 	for (sym = info.symtab_start; sym < info.symtab_stop; sym++) {
@@ -1778,14 +1777,13 @@ static void check_exports(struct module *mod)
 		exp = find_symbol(s->name);
 		if (!exp) {
 			if (!s->weak && nr_unresolved++ < MAX_UNRESOLVED_REPORTS)
-				modpost_log(!warn_unresolved, NULL,
-					    "\"%s\" [%s.ko] undefined!\n",
-					    s->name, mod->name);
+				modpost_log(!warn_unresolved, mod,
+					    "symbol '%s' undefined!\n",
+					    s->name);
 			continue;
 		}
 		if (exp->module == mod) {
-			error("\"%s\" [%s.ko] was exported without definition\n",
-			      s->name, mod->name);
+			mod_error(mod, "symbol '%s' was exported without definition\n", s->name);
 			continue;
 		}
 
@@ -1798,15 +1796,15 @@ static void check_exports(struct module *mod)
 
 		if (!verify_module_namespace(exp->namespace, basename) &&
 		    !contains_namespace(&mod->imported_namespaces, exp->namespace)) {
-			modpost_log(!allow_missing_ns_imports, NULL,
-				    "module %s uses symbol %s from namespace %s, but does not import it.\n",
-				    basename, exp->name, exp->namespace);
+			modpost_log(!allow_missing_ns_imports, mod,
+				    "module uses symbol '%s' from namespace '%s', but does not import it.\n",
+				    exp->name, exp->namespace);
 			add_namespace(&mod->missing_namespaces, exp->namespace);
 		}
 
 		if (!mod->is_gpl_compatible && exp->is_gpl_only)
-			error("GPL-incompatible module %s.ko uses GPL-only symbol '%s'\n",
-			      basename, exp->name);
+			mod_error(mod, "GPL-incompatible module uses GPL-only symbol '%s'\n",
+				  exp->name);
 	}
 }
 
@@ -1856,7 +1854,7 @@ static void check_modname_len(struct module *mod)
 	mod_name = get_basename(mod->name);
 
 	if (strlen(mod_name) >= MODULE_NAME_LEN)
-		error("module name is too long [%s.ko]\n", mod->name);
+		mod_error(mod, "module name is too long\n");
 }
 
 /**
@@ -1920,10 +1918,9 @@ static void add_exported_symbols(struct buffer *buf, struct module *mod)
 			continue;
 
 		if (!sym->crc_valid)
-			warn("EXPORT symbol \"%s\" [%s%s] version generation failed, symbol will not be versioned.\n"
-			     "Is \"%s\" prototyped in <asm/asm-prototypes.h>?\n",
-			     sym->name, mod->name, mod->is_vmlinux ? "" : ".ko",
-			     sym->name);
+			mod_warn(mod, "EXPORT symbol '%s' version generation failed, symbol will not be versioned.\n"
+				 "Is '%s' prototyped in <asm/asm-prototypes.h>?\n",
+				 sym->name, sym->name);
 
 		buf_printf(buf, "SYMBOL_CRC(%s, 0x%08x);\n",
 			   sym->name, sym->crc);
@@ -1947,8 +1944,7 @@ static void add_extended_versions(struct buffer *b, struct module *mod)
 		if (!s->module)
 			continue;
 		if (!s->crc_valid) {
-			warn("\"%s\" [%s.ko] has no CRC!\n",
-				s->name, mod->name);
+			mod_warn(mod, "symbol '%s' has no CRC!\n", s->name);
 			continue;
 		}
 		buf_printf(b, "\t0x%08x,\n", s->crc);
@@ -1991,8 +1987,7 @@ static void add_versions(struct buffer *b, struct module *mod)
 		if (!s->module)
 			continue;
 		if (!s->crc_valid) {
-			warn("\"%s\" [%s.ko] has no CRC!\n",
-				s->name, mod->name);
+			mod_warn(mod, "symbol '%s' has no CRC!\n", s->name);
 			continue;
 		}
 		if (strlen(s->name) >= MODULE_NAME_LEN) {
@@ -2000,8 +1995,7 @@ static void add_versions(struct buffer *b, struct module *mod)
 				/* this symbol will only be in the extended info */
 				continue;
 			} else {
-				error("too long symbol \"%s\" [%s.ko]\n",
-				      s->name, mod->name);
+				mod_error(mod, "too long symbol '%s'\n", s->name);
 				break;
 			}
 		}
-- 
2.47.3


  parent reply	other threads:[~2026-08-07 16:30 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-07 16:29 [PATCH 0/2] modpost: error logging cleanups Jani Nikula
2026-08-07 16:29 ` [PATCH 1/2] modpost: add module as parameter to modpost_log() Jani Nikula
2026-08-07 16:29 ` Jani Nikula [this message]
2026-08-07 20:06 ` [PATCH 0/2] modpost: error logging cleanups Nicolas Schier
2026-08-07 20:10 ` Nicolas Schier
2026-08-07 21:22 ` Nathan Chancellor

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=17ed1bce5d54fb32533ba83bc83c429cb71adcb0.1786120005.git.jani.nikula@intel.com \
    --to=jani.nikula@intel.com \
    --cc=linux-kbuild@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nathan@kernel.org \
    --cc=nsc@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®