Re: [PATCH v2] modpost: Ignore Clang LTO suffixes in symbol matching
Rong Xu <[email protected]>
| Newsgroups | org.kernel.vger.linux-kbuild,dev.linux.lists.llvm,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <CAF1bQ=RjCH8PSimVRE1RdR91TptadYigp=RcUOVc-rJWvu2K6w@mail.gmail.com> |
Changelog: This V2 integrated reviews from Petr Pavlu <[email protected]> and Nathan Chancellor <[email protected]> to use a more direct fix. Thanks, Rong On Wed, Jun 17, 2026 at 3:46 PM <[email protected]> wrote: > > From: Rong Xu <[email protected]> > > When building the kernel with Clang ThinLTO enabled, the compiler > can mangle static variable names by appending suffixes such as > ".llvm.<hash>" to prevent naming collisions across translation units. > > This name mangling breaks the section mismatch whitelisting in modpost. > modpost relies on glob patterns (e.g., "*_ops" or "*_probe") to identify > safe references between permanent data and initialization code. Because > the LTO suffix modifies the end of the symbol name, legitimately > whitelisted structures fail the match, resulting in false positive > warnings. > > For example, a static pernet_operations struct triggers the following: > > WARNING: modpost: vmlinux: section mismatch in reference: \ > ping_v4_net_ops.llvm.5641696707737373282 (section: .data) -> \ > ping_v4_proc_init_net (section: .init.text) > > Fix this by ignoring "*_ops.llvm.*" in "from" symbol names (the same > as "*_ops"). > > Reported-by: kernel test robot <[email protected]> > Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/ > Signed-off-by: Rong Xu <[email protected]> > --- > scripts/mod/modpost.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c > index d592548cbd60..a7b72a81d248 100644 > --- a/scripts/mod/modpost.c > +++ b/scripts/mod/modpost.c > @@ -969,7 +969,7 @@ static int secref_whitelist(const char *fromsec, const char *fromsym, > /* symbols in data sections that may refer to any init/exit sections */ > if (match(fromsec, PATTERNS(DATA_SECTIONS)) && > match(tosec, PATTERNS(ALL_INIT_SECTIONS, ALL_EXIT_SECTIONS)) && > - match(fromsym, PATTERNS("*_ops", "*_console"))) > + match(fromsym, PATTERNS("*_ops", "*_ops.llvm.*", "*_console"))) > return 0; > > /* Check for pattern 3 */ > > base-commit: e771677c937da5808f7b6c1f0e4a97ec1a84f8a8 > -- > 2.55.0.rc0.738.g0c8ab3ebcc-goog >