]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
modpost: improve the section mismatch warning format
authorMasahiro Yamada <masahiroy@kernel.org>
Mon, 12 Aug 2024 16:54:51 +0000 (01:54 +0900)
committerMasahiro Yamada <masahiroy@kernel.org>
Sun, 1 Sep 2024 11:34:49 +0000 (20:34 +0900)
This commit improves the section mismatch warning format when there is
no suitable symbol name to print.

The section mismatch warning prints the reference source in the form
of <symbol_name>+<offset> and the reference destination in the form
of <symbol_name>.

However, there are some corner cases where <symbol_name> becomes
"(unknown)", as reported in commit 23dfd914d2bf ("modpost: fix null
pointer dereference").

In such cases, it is better to print the symbol address.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
scripts/mod/modpost.c

index 66bd89b2a8b689774b114757f5c60298c7468da8..704963cba5fea0fc1594660a61a972c7e4b97a4c 100644 (file)
@@ -697,10 +697,7 @@ static char *get_modinfo(struct elf_info *info, const char *tag)
 
 static const char *sym_name(struct elf_info *elf, Elf_Sym *sym)
 {
-       if (sym)
-               return elf->strtab + sym->st_name;
-       else
-               return "(unknown)";
+       return sym ? elf->strtab + sym->st_name : "";
 }
 
 /*
@@ -1013,6 +1010,7 @@ static void default_mismatch_handler(const char *modname, struct elf_info *elf,
        Elf_Sym *from;
        const char *tosym;
        const char *fromsym;
+       char taddr_str[16];
 
        from = find_fromsym(elf, faddr, fsecndx);
        fromsym = sym_name(elf, from);
@@ -1026,10 +1024,17 @@ static void default_mismatch_handler(const char *modname, struct elf_info *elf,
 
        sec_mismatch_count++;
 
-       warn("%s: section mismatch in reference: %s+0x%x (section: %s) -> %s (section: %s)\n",
-            modname, fromsym,
-            (unsigned int)(faddr - (from ? from->st_value : 0)),
-            fromsec, tosym, tosec);
+       if (!tosym[0])
+               snprintf(taddr_str, sizeof(taddr_str), "0x%x", (unsigned int)taddr);
+
+       /*
+        * 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);
 
        if (mismatch->mismatch == EXTABLE_TO_NON_TEXT) {
                if (match(tosec, mismatch->bad_tosec))