Re: [PATCH v2] modpost: Ignore Clang LTO suffixes in symbol matching

From: Rong Xu

Date: Wed Jun 17 2026 - 18:52:29 EST


Changelog: This V2 integrated reviews from Petr Pavlu
<petr.pavlu@xxxxxxxx> and Nathan Chancellor <nathan@xxxxxxxxxx> to
use a more direct fix.

Thanks,

Rong

On Wed, Jun 17, 2026 at 3:46 PM <xur@xxxxxxxxxx> wrote:
>
> From: Rong Xu <xur@xxxxxxxxxx>
>
> 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 <lkp@xxxxxxxxx>
> Closes: https://lore.kernel.org/oe-kbuild-all/202606111233.kM8oo8Df-lkp@xxxxxxxxx/
> Signed-off-by: Rong Xu <xur@xxxxxxxxxx>
> ---
> 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
>