Message ID | 20220424190811.1678416-5-masahiroy@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | kbuild: yet another series of cleanups (modpost and LTO) | expand |
On Sun, Apr 24, 2022 at 12:09 PM Masahiro Yamada <masahiroy@kernel.org> wrote: > > It took me a while to understand the intent of "exp->module == mod". > > This code goes back to 2003 (pre-git era). > > The commit is not in this git repository, and might be worth a little > explanation. > > You can add EXPORT_SYMBOL() with no definition in the same file (but you > need to put a declaration). > > int foo(void); > EXPORT_SYMBOL(foo); > > This is typical when EXPORT_SYMBOL() is defined in a C file, but the > actual implementation is in a separate assembly file. In old days, > EXPORT_SYMBOL() were only available in C files (but this limitation > does not exist any more). > > Add a separate, clearer message if an exported symbol has no definition. > It should be an error even if KBUILD_MODPOST_WARN is given. > > [1]: https://git.kernel.org/pub/scm/linux/kernel/git/history/history.git/commit/?id=2763b6bcb96e6a38a2fe31108fe5759ec5bcc80a Differentiating between the two (and your explanation of how to reach such a situation) is a nice touch. Reviewed-by: Nick Desaulniers <ndesaulniers@google.com> > > Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> > --- > > scripts/mod/modpost.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c > index c7cfeeb088f7..969a081dba62 100644 > --- a/scripts/mod/modpost.c > +++ b/scripts/mod/modpost.c > @@ -2147,13 +2147,18 @@ static void check_exports(struct module *mod) > for (s = mod->unres; s; s = s->next) { > const char *basename; > exp = find_symbol(s->name); > - if (!exp || exp->module == mod) { > + if (!exp) { > if (!s->weak && nr_unresolved++ < MAX_UNRESOLVED_REPORTS) > modpost_log(warn_unresolved ? LOG_WARN : LOG_ERROR, > "\"%s\" [%s.ko] undefined!\n", > s->name, mod->name); > continue; > } > + if (exp->module == mod) { > + error("\"%s\" [%s.ko] was exported without definition\n", > + s->name, mod->name); > + continue; > + } > basename = strrchr(mod->name, '/'); > if (basename) > basename++; > -- > 2.32.0 >
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index c7cfeeb088f7..969a081dba62 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -2147,13 +2147,18 @@ static void check_exports(struct module *mod) for (s = mod->unres; s; s = s->next) { const char *basename; exp = find_symbol(s->name); - if (!exp || exp->module == mod) { + if (!exp) { if (!s->weak && nr_unresolved++ < MAX_UNRESOLVED_REPORTS) modpost_log(warn_unresolved ? LOG_WARN : LOG_ERROR, "\"%s\" [%s.ko] undefined!\n", s->name, mod->name); continue; } + if (exp->module == mod) { + error("\"%s\" [%s.ko] was exported without definition\n", + s->name, mod->name); + continue; + } basename = strrchr(mod->name, '/'); if (basename) basename++;
It took me a while to understand the intent of "exp->module == mod". This code goes back to 2003 (pre-git era). The commit is not in this git repository, and might be worth a little explanation. You can add EXPORT_SYMBOL() with no definition in the same file (but you need to put a declaration). int foo(void); EXPORT_SYMBOL(foo); This is typical when EXPORT_SYMBOL() is defined in a C file, but the actual implementation is in a separate assembly file. In old days, EXPORT_SYMBOL() were only available in C files (but this limitation does not exist any more). Add a separate, clearer message if an exported symbol has no definition. It should be an error even if KBUILD_MODPOST_WARN is given. [1]: https://git.kernel.org/pub/scm/linux/kernel/git/history/history.git/commit/?id=2763b6bcb96e6a38a2fe31108fe5759ec5bcc80a Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> --- scripts/mod/modpost.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)