Messages in this thread | | | From | Fāng-ruì Sòng <> | Date | Thu, 14 Jan 2021 08:57:10 -0800 | Subject | Re: [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.
| |