lkml.org 
[lkml]   [2021]   [Jan]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
From
Date
SubjectRe: [PATCH] module: Ignore _GLOBAL_OFFSET_TABLE_ when warning for undefined symbols
On Thu, Jan 14, 2021 at 6:06 AM Jessica Yu <jeyu@kernel.org> wrote:
>
> +++ Fangrui Song [13/01/21 21:48 -0800]:
> >clang-12 -fno-pic (since
> >https://github.com/llvm/llvm-project/commit/a084c0388e2a59b9556f2de0083333232da3f1d6)
> >can emit `call __stack_chk_fail@PLT` instead of `call __stack_chk_fail`
> >on x86. The two forms should have identical behaviors on x86-64 but the
> >former causes GNU as<2.37 to produce an unreferenced undefined symbol
> >_GLOBAL_OFFSET_TABLE_.
> >
> >(On x86-32, there is an R_386_PC32 vs R_386_PLT32 difference but the
> >linker behavior is identical as far as Linux kernel is concerned.)
> >
> >Simply ignore _GLOBAL_OFFSET_TABLE_ for now, like what
> >scripts/mod/modpost.c:ignore_undef_symbol does. This also fixes the
> >problem for gcc/clang -fpie and -fpic, which may emit `call foo@PLT` for
> >external function calls on x86.
> >
> >Note: ld -z defs and dynamic loaders do not error for unreferenced
> >undefined symbols so the module loader is reading too much. If we ever
> >need to ignore more symbols, the code should be refactored to ignore
> >unreferenced symbols.
> >
> >Reported-by: Marco Elver <melver@google.com>
> >Link: https://github.com/ClangBuiltLinux/linux/issues/1250
> >Signed-off-by: Fangrui Song <maskray@google.com>
> >---
> > kernel/module.c | 10 ++++++++--
> > 1 file changed, 8 insertions(+), 2 deletions(-)
> >
> >diff --git a/kernel/module.c b/kernel/module.c
> >index 4bf30e4b3eaa..2e2deea99289 100644
> >--- a/kernel/module.c
> >+++ b/kernel/module.c
> >@@ -2395,8 +2395,14 @@ static int simplify_symbols(struct module *mod, const struct load_info *info)
> > break;
> > }
> >
> >- /* Ok if weak. */
> >- if (!ksym && ELF_ST_BIND(sym[i].st_info) == STB_WEAK)
> >+ /* Ok if weak. Also allow _GLOBAL_OFFSET_TABLE_:
> >+ * GNU as before 2.37 produces an unreferenced _GLOBAL_OFFSET_TABLE_
> >+ * for call foo@PLT on x86-64. If the code ever needs to ignore
> >+ * more symbols, refactor the code to only warn if referenced by
> >+ * a relocation.
> >+ */
> >+ if (!ksym && (ELF_ST_BIND(sym[i].st_info) == STB_WEAK ||
> >+ !strcmp(name, "_GLOBAL_OFFSET_TABLE_")))
> > break;
>
> Hi Fangrui,
>
> Thanks for the patch. I am puzzled why we don't already mirror modpost
> here, that particular line of code in modpost to ignore _GLOBAL_OFFSET_TABLE_
> has been there long before my time. Let's properly mirror modpost
> then, and create a similar helper function ignore_undef_symbol() (and
> stick the _GLOBAL_OFFSET_TABLE_ check in there) to account for future
> cases like this.
>
> Thanks,
>
> Jessica

Hi Jessica,

I guess __this_module in scripts/mod/modpost.c:ignore_undef_symbol is
not a problem.
For PPC64 _restgpr0_* and _savegpr0_*, I am not sure ignoring the
undefined functions in kernel/module.c is right.
(I know they can be produced by gcc -Os in some cases
(https://reviews.llvm.org/D79977), but I want to learn whether that is
a real issue before adding them.)

If we ever need to ignore more symbols, the code should be refactored
to not warn for unreferenced undefined symbols as my description says.

\
 
 \ /
  Last update: 2021-01-14 17:58    [W:0.083 / U:0.068 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site