Message ID | 20240812165455.2156964-1-masahiroy@kernel.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | modpost: improve the section mismatch warning format | expand |
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>
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))
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(-)