public inbox for live-patching@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] klp-build: Do not warn "no correlation" for __irf_[start|end]
@ 2026-01-30 20:39 Song Liu
  2026-01-31  2:26 ` Josh Poimboeuf
  0 siblings, 1 reply; 3+ messages in thread
From: Song Liu @ 2026-01-30 20:39 UTC (permalink / raw)
  To: live-patching
  Cc: jpoimboe, kernel-team, jikos, mbenes, pmladek, joe.lawrence,
	Song Liu

When compiling with CONFIG_LTO_CLANG_THIN, vmlinux.o has
__irf_[start|end] before the first FILE entry:

$ readelf -sW vmlinux.o
Symbol table '.symtab' contains 597706 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT   18 __irf_start
     2: 0000000000000200     0 NOTYPE  LOCAL  DEFAULT   18 __irf_end
     3: 0000000000000000     0 SECTION LOCAL  DEFAULT   17 .text
     4: 0000000000000000     0 SECTION LOCAL  DEFAULT   18 .init.ramfs

This causes klp-build throwing warnings like:

vmlinux.o: warning: objtool: no correlation: __irf_start
vmlinux.o: warning: objtool: no correlation: __irf_end

Fix this by not warn for no correlation before seeing the first FILE
entry.

Signed-off-by: Song Liu <song@kernel.org>
---
 tools/objtool/klp-diff.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/tools/objtool/klp-diff.c b/tools/objtool/klp-diff.c
index d94531e3f64e..370e5c79ae66 100644
--- a/tools/objtool/klp-diff.c
+++ b/tools/objtool/klp-diff.c
@@ -363,6 +363,7 @@ static int correlate_symbols(struct elfs *e)
 {
 	struct symbol *file1_sym, *file2_sym;
 	struct symbol *sym1, *sym2;
+	bool found_first_file = false;
 
 	/* Correlate locals */
 	for (file1_sym = first_file_symbol(e->orig),
@@ -432,9 +433,12 @@ static int correlate_symbols(struct elfs *e)
 	}
 
 	for_each_sym(e->orig, sym1) {
+		if (!found_first_file && is_file_sym(sym1))
+			found_first_file = true;
 		if (sym1->twin || dont_correlate(sym1))
 			continue;
-		WARN("no correlation: %s", sym1->name);
+		if (found_first_file)
+			WARN("no correlation: %s", sym1->name);
 	}
 
 	return 0;
-- 
2.47.3


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] klp-build: Do not warn "no correlation" for __irf_[start|end]
  2026-01-30 20:39 [PATCH] klp-build: Do not warn "no correlation" for __irf_[start|end] Song Liu
@ 2026-01-31  2:26 ` Josh Poimboeuf
  2026-02-01  4:26   ` Song Liu
  0 siblings, 1 reply; 3+ messages in thread
From: Josh Poimboeuf @ 2026-01-31  2:26 UTC (permalink / raw)
  To: Song Liu; +Cc: live-patching, kernel-team, jikos, mbenes, pmladek, joe.lawrence

On Fri, Jan 30, 2026 at 12:39:12PM -0800, Song Liu wrote:
> When compiling with CONFIG_LTO_CLANG_THIN, vmlinux.o has
> __irf_[start|end] before the first FILE entry:
> 
> $ readelf -sW vmlinux.o
> Symbol table '.symtab' contains 597706 entries:
>    Num:    Value          Size Type    Bind   Vis      Ndx Name
>      0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
>      1: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT   18 __irf_start
>      2: 0000000000000200     0 NOTYPE  LOCAL  DEFAULT   18 __irf_end
>      3: 0000000000000000     0 SECTION LOCAL  DEFAULT   17 .text
>      4: 0000000000000000     0 SECTION LOCAL  DEFAULT   18 .init.ramfs
> 
> This causes klp-build throwing warnings like:
> 
> vmlinux.o: warning: objtool: no correlation: __irf_start
> vmlinux.o: warning: objtool: no correlation: __irf_end
> 
> Fix this by not warn for no correlation before seeing the first FILE
> entry.
> 
> Signed-off-by: Song Liu <song@kernel.org>
> ---
>  tools/objtool/klp-diff.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/tools/objtool/klp-diff.c b/tools/objtool/klp-diff.c
> index d94531e3f64e..370e5c79ae66 100644
> --- a/tools/objtool/klp-diff.c
> +++ b/tools/objtool/klp-diff.c
> @@ -363,6 +363,7 @@ static int correlate_symbols(struct elfs *e)
>  {
>  	struct symbol *file1_sym, *file2_sym;
>  	struct symbol *sym1, *sym2;
> +	bool found_first_file = false;
>  
>  	/* Correlate locals */
>  	for (file1_sym = first_file_symbol(e->orig),
> @@ -432,9 +433,12 @@ static int correlate_symbols(struct elfs *e)
>  	}
>  
>  	for_each_sym(e->orig, sym1) {
> +		if (!found_first_file && is_file_sym(sym1))
> +			found_first_file = true;
>  		if (sym1->twin || dont_correlate(sym1))
>  			continue;
> -		WARN("no correlation: %s", sym1->name);
> +		if (found_first_file)
> +			WARN("no correlation: %s", sym1->name);

It's a bit worrisome that Clang is stripping FILE entries and moving
symbols, but I looked at the symbol table for a thin LTO vmlinux.o and
it only seems to have stripped this one FILE symbol for initramfs_data.o
and made its symbols orphans.  Presumably because this file only has
data and no code.

I actually think the warning is valid.  We should try to correlate those
pre-FILE symbols, otherwise things like klp_reloc_needed() might not
work as intended.

Does the below patch work instead?

diff --git a/tools/objtool/klp-diff.c b/tools/objtool/klp-diff.c
index d94531e3f64e..ea292ebe217f 100644
--- a/tools/objtool/klp-diff.c
+++ b/tools/objtool/klp-diff.c
@@ -364,11 +364,40 @@ static int correlate_symbols(struct elfs *e)
 	struct symbol *file1_sym, *file2_sym;
 	struct symbol *sym1, *sym2;
 
-	/* Correlate locals */
-	for (file1_sym = first_file_symbol(e->orig),
-	     file2_sym = first_file_symbol(e->patched); ;
-	     file1_sym = next_file_symbol(e->orig, file1_sym),
-	     file2_sym = next_file_symbol(e->patched, file2_sym)) {
+	file1_sym = first_file_symbol(e->orig);
+	file2_sym = first_file_symbol(e->patched);
+
+	/*
+	 * Correlate any locals before the first FILE symbol.  This has been
+	 * seen when LTO inexplicably strips the initramfs_data.o FILE symbol
+	 * due to the file only containing data and no code.
+	 */
+	for_each_sym(e->orig, sym1) {
+		if (sym1 == file1_sym || !is_local_sym(sym1))
+			break;
+
+		if (dont_correlate(sym1))
+			continue;
+
+		for_each_sym(e->patched, sym2) {
+			if (sym2 == file2_sym || !is_local_sym(sym2))
+				break;
+
+			if (sym2->twin || dont_correlate(sym2))
+				continue;
+
+			if (strcmp(sym1->demangled_name, sym2->demangled_name))
+				continue;
+
+			sym1->twin = sym2;
+			sym2->twin = sym1;
+			break;
+		}
+	}
+
+	/* Correlate locals after the first FILE symbol */
+	for (; ; file1_sym = next_file_symbol(e->orig, file1_sym),
+		 file2_sym = next_file_symbol(e->patched, file2_sym)) {
 
 		if (!file1_sym && file2_sym) {
 			ERROR("FILE symbol mismatch: NULL != %s", file2_sym->name);

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] klp-build: Do not warn "no correlation" for __irf_[start|end]
  2026-01-31  2:26 ` Josh Poimboeuf
@ 2026-02-01  4:26   ` Song Liu
  0 siblings, 0 replies; 3+ messages in thread
From: Song Liu @ 2026-02-01  4:26 UTC (permalink / raw)
  To: Josh Poimboeuf
  Cc: live-patching, kernel-team, jikos, mbenes, pmladek, joe.lawrence

On Fri, Jan 30, 2026 at 6:27 PM Josh Poimboeuf <jpoimboe@kernel.org> wrote:
[...]
> It's a bit worrisome that Clang is stripping FILE entries and moving
> symbols, but I looked at the symbol table for a thin LTO vmlinux.o and
> it only seems to have stripped this one FILE symbol for initramfs_data.o
> and made its symbols orphans.  Presumably because this file only has
> data and no code.
>
> I actually think the warning is valid.  We should try to correlate those
> pre-FILE symbols, otherwise things like klp_reloc_needed() might not
> work as intended.
>
> Does the below patch work instead?

Yes, this does look better. Let's ship this version.

Thanks,
Song

>
> diff --git a/tools/objtool/klp-diff.c b/tools/objtool/klp-diff.c
> index d94531e3f64e..ea292ebe217f 100644
> --- a/tools/objtool/klp-diff.c
> +++ b/tools/objtool/klp-diff.c
> @@ -364,11 +364,40 @@ static int correlate_symbols(struct elfs *e)
>         struct symbol *file1_sym, *file2_sym;
>         struct symbol *sym1, *sym2;
>
> -       /* Correlate locals */
> -       for (file1_sym = first_file_symbol(e->orig),
> -            file2_sym = first_file_symbol(e->patched); ;
> -            file1_sym = next_file_symbol(e->orig, file1_sym),
> -            file2_sym = next_file_symbol(e->patched, file2_sym)) {
> +       file1_sym = first_file_symbol(e->orig);
> +       file2_sym = first_file_symbol(e->patched);
> +
> +       /*
> +        * Correlate any locals before the first FILE symbol.  This has been
> +        * seen when LTO inexplicably strips the initramfs_data.o FILE symbol
> +        * due to the file only containing data and no code.
> +        */
> +       for_each_sym(e->orig, sym1) {
> +               if (sym1 == file1_sym || !is_local_sym(sym1))
> +                       break;
> +
> +               if (dont_correlate(sym1))
> +                       continue;
> +
> +               for_each_sym(e->patched, sym2) {
> +                       if (sym2 == file2_sym || !is_local_sym(sym2))
> +                               break;
> +
> +                       if (sym2->twin || dont_correlate(sym2))
> +                               continue;
> +
> +                       if (strcmp(sym1->demangled_name, sym2->demangled_name))
> +                               continue;
> +
> +                       sym1->twin = sym2;
> +                       sym2->twin = sym1;
> +                       break;
> +               }
> +       }
> +
> +       /* Correlate locals after the first FILE symbol */
> +       for (; ; file1_sym = next_file_symbol(e->orig, file1_sym),
> +                file2_sym = next_file_symbol(e->patched, file2_sym)) {
>
>                 if (!file1_sym && file2_sym) {
>                         ERROR("FILE symbol mismatch: NULL != %s", file2_sym->name);

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-02-01  4:26 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-30 20:39 [PATCH] klp-build: Do not warn "no correlation" for __irf_[start|end] Song Liu
2026-01-31  2:26 ` Josh Poimboeuf
2026-02-01  4:26   ` Song Liu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox