[PATCH 2/2] modpost: use mod_warn() and mod_error(), clean up logging

Jani Nikula <[email protected]>
Newsgroups org.kernel.vger.linux-kbuild,org.kernel.vger.linux-kernel
Organization Intel Finland Oy - BIC 0357606-4 - c/o Alberga Business Park, 6 krs Bertel Jungin Aukio 5, 02600 Espoo, Finland
Message-ID <17ed1bce5d54fb32533ba83bc83c429cb71adcb0.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 <[email protected]>
Cc: Nicolas Schier <[email protected]>
Signed-off-by: Jani Nikula <[email protected]>

---

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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.