* [PATCH] modpost: improve the section mismatch warning format
@ 2024-08-12 16:54 Masahiro Yamada
2024-08-17 13:17 ` Nicolas Schier
0 siblings, 1 reply; 2+ messages in thread
From: Masahiro Yamada @ 2024-08-12 16:54 UTC (permalink / raw)
To: linux-kbuild
Cc: linux-kernel, Masahiro Yamada, Nathan Chancellor, Nicolas Schier
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 | 21 +++++++++++++--------
1 file changed, 13 insertions(+), 8 deletions(-)
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index d0f138803207..3e474291258c 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -705,10 +705,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 : "";
}
/*
@@ -1021,6 +1018,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);
@@ -1034,10 +1032,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))
--
2.43.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] modpost: improve the section mismatch warning format
2024-08-12 16:54 [PATCH] modpost: improve the section mismatch warning format Masahiro Yamada
@ 2024-08-17 13:17 ` Nicolas Schier
0 siblings, 0 replies; 2+ messages in thread
From: Nicolas Schier @ 2024-08-17 13:17 UTC (permalink / raw)
To: Masahiro Yamada; +Cc: linux-kbuild, linux-kernel, Nathan Chancellor
On Tue, Aug 13, 2024 at 01:54:51AM +0900, Masahiro Yamada wrote:
> 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 | 21 +++++++++++++--------
> 1 file changed, 13 insertions(+), 8 deletions(-)
>
> diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
> index d0f138803207..3e474291258c 100644
> --- a/scripts/mod/modpost.c
> +++ b/scripts/mod/modpost.c
> @@ -705,10 +705,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 : "";
> }
>
> /*
> @@ -1021,6 +1018,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);
> @@ -1034,10 +1032,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))
> --
> 2.43.0
>
Reviewed-by: Nicolas Schier <nicolas@fjasle.eu>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2024-08-17 13:17 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-08-12 16:54 [PATCH] modpost: improve the section mismatch warning format Masahiro Yamada
2024-08-17 13:17 ` Nicolas Schier
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox