[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20240817-strong-passionate-gecko-dd86ac@lindesnes>
Date: Sat, 17 Aug 2024 15:17:47 +0200
From: Nicolas Schier <nicolas@...sle.eu>
To: Masahiro Yamada <masahiroy@...nel.org>
Cc: linux-kbuild@...r.kernel.org, linux-kernel@...r.kernel.org,
Nathan Chancellor <nathan@...nel.org>
Subject: Re: [PATCH] modpost: improve the section mismatch warning format
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@...nel.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@...sle.eu>
Powered by blists - more mailing lists