Live Patching
 help / color / mirror / Atom feed
From: Josh Poimboeuf <jpoimboe@kernel.org>
To: x86@kernel.org
Cc: linux-kernel@vger.kernel.org, live-patching@vger.kernel.org,
	Peter Zijlstra <peterz@infradead.org>,
	Joe Lawrence <joe.lawrence@redhat.com>,
	Song Liu <song@kernel.org>, Miroslav Benes <mbenes@suse.cz>,
	Petr Mladek <pmladek@suse.com>
Subject: [PATCH v2 19/53] objtool/klp: Fix pointer comparisons for rodata objects
Date: Thu, 30 Apr 2026 21:08:07 -0700	[thread overview]
Message-ID: <07de8098fd8981321baab0ff552f65aa2cfc31ec.1777575752.git.jpoimboe@kernel.org> (raw)
In-Reply-To: <cover.1777575752.git.jpoimboe@kernel.org>

klp-diff treats all rodata as uncorrelated, so any reference to it uses
a duplicated copy rather than using a KLP reloc.

For the contents of the data itself, a duplicated copy is fine.
However, pointer comparisons (e.g., f->f_op == &foo_ops) are broken.

Fix it by correlating non-anonymous rodata objects.

Also, use a new find_symbol_containing_inclusive() helper for matching
the end of a symbol so bounds calculations don't get broken, for the
case where an array or other symbol's ending address is used as part of
a bounds calculation.

While these are really two distinct changes, they need to be done in the
same patch so as to avoid introducing bisection regressions.

Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
---
 tools/objtool/elf.c                 | 14 ++++++++++++++
 tools/objtool/include/objtool/elf.h |  1 +
 tools/objtool/klp-diff.c            | 15 +++++++++++++--
 3 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c
index 87c6e00749c6..5a20dab683dd 100644
--- a/tools/objtool/elf.c
+++ b/tools/objtool/elf.c
@@ -207,6 +207,20 @@ struct symbol *find_symbol_containing(const struct section *sec, unsigned long o
 	return sym ? sym->alias : NULL;
 }
 
+/*
+ * Also match the symbol end address which can be used for a bounds comparison.
+ */
+struct symbol *find_symbol_containing_inclusive(const struct section *sec,
+						unsigned long offset)
+{
+	struct symbol *sym = find_symbol_containing(sec, offset);
+
+	if (!sym && offset)
+		sym = find_symbol_containing(sec, offset - 1);
+
+	return sym;
+}
+
 /*
  * Returns size of hole starting at @offset.
  */
diff --git a/tools/objtool/include/objtool/elf.h b/tools/objtool/include/objtool/elf.h
index ab5f7017ec34..8a543cea43b9 100644
--- a/tools/objtool/include/objtool/elf.h
+++ b/tools/objtool/include/objtool/elf.h
@@ -211,6 +211,7 @@ struct symbol *find_symbol_by_offset(struct section *sec, unsigned long offset);
 struct symbol *find_symbol_by_name(const struct elf *elf, const char *name);
 struct symbol *find_global_symbol_by_name(const struct elf *elf, const char *name);
 struct symbol *find_symbol_containing(const struct section *sec, unsigned long offset);
+struct symbol *find_symbol_containing_inclusive(const struct section *sec, unsigned long offset);
 int find_symbol_hole_containing(const struct section *sec, unsigned long offset);
 struct reloc *find_reloc_by_dest(const struct elf *elf, struct section *sec, unsigned long offset);
 struct reloc *find_reloc_by_dest_range(const struct elf *elf, struct section *sec,
diff --git a/tools/objtool/klp-diff.c b/tools/objtool/klp-diff.c
index 78633c9b68eb..bf37c652188b 100644
--- a/tools/objtool/klp-diff.c
+++ b/tools/objtool/klp-diff.c
@@ -386,6 +386,7 @@ static bool dont_correlate(struct symbol *sym)
 	       is_uncorrelated_static_local(sym) ||
 	       is_local_label(sym) ||
 	       is_string_sec(sym->sec) ||
+	       (is_rodata_sec(sym->sec) && !is_object_sym(sym)) ||
 	       is_initcall_sym(sym) ||
 	       is_addressable_sym(sym) ||
 	       is_special_section(sym->sec) ||
@@ -979,7 +980,7 @@ static int convert_reloc_secsym_to_sym(struct elf *elf, struct reloc *reloc)
 		goto found_sym;
 
 	/* No dedicated section; find the symbol manually */
-	sym = find_symbol_containing(sec, arch_adjusted_addend(reloc));
+	sym = find_symbol_containing_inclusive(sec, arch_adjusted_addend(reloc));
 	if (!sym) {
 		/*
 		 * This is presumably an .altinstr_replacement section which is
@@ -988,6 +989,17 @@ static int convert_reloc_secsym_to_sym(struct elf *elf, struct reloc *reloc)
 		if (!sec_size(sec))
 			return 1;
 
+		/*
+		 * .rodata is a mixed bag of named objects and anonymous data.
+		 *
+		 * Convert section symbol references to named object symbols
+		 * when possible, to preserve pointer identity for const
+		 * structs like file_operations.  Otherwise a section symbol is
+		 * fine.
+		 */
+		if (is_rodata_sec(sec))
+			return 0;
+
 		/*
 		 * This can happen for special section references to weak code
 		 * whose symbol has been stripped by the linker.
@@ -1009,7 +1021,6 @@ static int convert_reloc_secsym_to_sym(struct elf *elf, struct reloc *reloc)
 static bool is_uncorrelated_section(struct section *sec)
 {
 	return is_string_sec(sec) ||
-	       strstarts(sec->name, ".rodata") ||
 	       strstarts(sec->name, ".data..Lubsan") ||		/* GCC */
 	       strstarts(sec->name, ".data..L__unnamed_");	/* Clang */
 }
-- 
2.53.0


  parent reply	other threads:[~2026-05-01  4:08 UTC|newest]

Thread overview: 103+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-01  4:07 [PATCH v2 00/53] objtool/klp: Some klp-build fixes and improvements Josh Poimboeuf
2026-05-01  4:07 ` [PATCH v2 01/53] objtool/klp: Fix is_uncorrelated_static_local() for Clang Josh Poimboeuf
2026-05-01  4:07 ` [PATCH v2 02/53] objtool/klp: Fix .data..once static local non-correlation Josh Poimboeuf
2026-05-01  4:07 ` [PATCH v2 03/53] objtool/klp: Don't correlate __ADDRESSABLE() symbols Josh Poimboeuf
2026-05-01 10:26   ` Song Liu
2026-05-01  4:07 ` [PATCH v2 04/53] objtool/klp: Don't correlate absolute symbols Josh Poimboeuf
2026-05-01  4:07 ` [PATCH v2 05/53] objtool/klp: Don't correlate __initstub__ symbols Josh Poimboeuf
2026-05-01  4:07 ` [PATCH v2 06/53] objtool/klp: Don't report uncorrelated functions as new Josh Poimboeuf
2026-05-01  4:07 ` [PATCH v2 07/53] objtool/klp: Improve local label check Josh Poimboeuf
2026-05-01 10:27   ` Song Liu
2026-05-01  4:07 ` [PATCH v2 08/53] objtool/klp: Fix create_fake_symbols() skipping entsize-based sections Josh Poimboeuf
2026-05-01  4:07 ` [PATCH v2 09/53] objtool: Replace iterator callback with for_each_sym_by_mangled_name() Josh Poimboeuf
2026-05-01 10:28   ` Song Liu
2026-05-04 13:59   ` Miroslav Benes
2026-05-01  4:07 ` [PATCH v2 10/53] objtool/klp: Fix --debug-checksum for duplicate symbol names Josh Poimboeuf
2026-05-04 14:04   ` Miroslav Benes
2026-05-01  4:07 ` [PATCH v2 11/53] objtool/klp: Fix handling of zero-length .altinstr_replacement sections Josh Poimboeuf
2026-05-01  4:08 ` [PATCH v2 12/53] objtool/klp: Fix cloning of zero-length section symbols Josh Poimboeuf
2026-05-01  4:08 ` [PATCH v2 13/53] objtool/klp: Fix XXH3 state memory leak Josh Poimboeuf
2026-05-01  4:08 ` [PATCH v2 14/53] objtool/klp: Fix extraction of text annotations for alternatives Josh Poimboeuf
2026-05-01  4:08 ` [PATCH v2 15/53] objtool/klp: Fix kCFI trap handling Josh Poimboeuf
2026-05-01  4:08 ` [PATCH v2 16/53] objtool/klp: Fix relocation conversion failures for R_X86_64_NONE Josh Poimboeuf
2026-05-01  4:08 ` [PATCH v2 17/53] objtool: Move mark_rodata() to elf.c Josh Poimboeuf
2026-05-01  4:08 ` [PATCH v2 18/53] objtool/klp: Simplify reloc symbol conversion Josh Poimboeuf
2026-05-01 10:31   ` Song Liu
2026-05-04 14:04   ` Miroslav Benes
2026-05-01  4:08 ` Josh Poimboeuf [this message]
2026-05-01 10:35   ` [PATCH v2 19/53] objtool/klp: Fix pointer comparisons for rodata objects Song Liu
2026-05-05  9:44   ` Miroslav Benes
2026-05-01  4:08 ` [PATCH v2 20/53] objtool/klp: Don't correlate .rodata.cst* constant pool objects Josh Poimboeuf
2026-05-01 10:37   ` Song Liu
2026-05-01 17:04     ` Josh Poimboeuf
2026-05-01 17:31       ` Song Liu
2026-05-05  9:44   ` Miroslav Benes
2026-05-01  4:08 ` [PATCH v2 21/53] objtool/klp: Fix reloc corruption in convert_reloc_sym_to_secsym() Josh Poimboeuf
2026-05-01 10:38   ` Song Liu
2026-05-05  9:44   ` Miroslav Benes
2026-05-01  4:08 ` [PATCH v2 22/53] objtool: Fix reloc hash collision in find_reloc_by_dest_range() Josh Poimboeuf
2026-05-01  4:08 ` [PATCH v2 23/53] klp-build: Fix hang on out-of-date .config Josh Poimboeuf
2026-05-01 10:39   ` Song Liu
2026-05-05  9:44   ` Miroslav Benes
2026-05-01  4:08 ` [PATCH v2 24/53] klp-build: Fix checksum comparison for changed offsets Josh Poimboeuf
2026-05-01 10:41   ` Song Liu
2026-05-05 10:05   ` Miroslav Benes
2026-05-01  4:08 ` [PATCH v2 25/53] klp-build: Don't use errexit Josh Poimboeuf
2026-05-01  4:08 ` [PATCH v2 26/53] klp-build: Validate patch file existence Josh Poimboeuf
2026-05-01  4:08 ` [PATCH v2 27/53] klp-build: Suppress excessive fuzz output by default Josh Poimboeuf
2026-05-01  4:08 ` [PATCH v2 28/53] klp-build: Fix patch cleanup on interrupt Josh Poimboeuf
2026-05-05 11:31   ` Miroslav Benes
2026-05-01  4:08 ` [PATCH v2 29/53] klp-build: Reject patches to vDSO Josh Poimboeuf
2026-05-05 11:31   ` Miroslav Benes
2026-05-01  4:08 ` [PATCH v2 30/53] klp-build: Reject patches to realmode Josh Poimboeuf
2026-05-05 11:31   ` Miroslav Benes
2026-05-01  4:08 ` [PATCH v2 31/53] klp-build: Print "objtool klp diff" command in verbose mode Josh Poimboeuf
2026-05-05 11:31   ` Miroslav Benes
2026-05-01  4:08 ` [PATCH v2 32/53] klp-build: Remove redundant SRC and OBJ variables Josh Poimboeuf
2026-05-01 10:42   ` Song Liu
2026-05-05 11:26   ` Miroslav Benes
2026-05-01  4:08 ` [PATCH v2 33/53] objtool/klp: Don't set sym->file for section symbols Josh Poimboeuf
2026-05-05 11:31   ` Miroslav Benes
2026-05-01  4:08 ` [PATCH v2 34/53] objtool: Include libsubcmd headers directly from source tree Josh Poimboeuf
2026-05-05 11:31   ` Miroslav Benes
2026-05-01  4:08 ` [PATCH v2 35/53] objtool/klp: Create empty checksum sections for function-less object files Josh Poimboeuf
2026-05-05 11:31   ` Miroslav Benes
2026-05-01  4:08 ` [PATCH v2 36/53] objtool/klp: Handle Clang .data..Lanon anonymous data sections Josh Poimboeuf
2026-05-05 11:26   ` Miroslav Benes
2026-05-01  4:08 ` [PATCH v2 37/53] objtool: Add is_alias_sym() helper Josh Poimboeuf
2026-05-05 11:31   ` Miroslav Benes
2026-05-01  4:08 ` [PATCH v2 38/53] objtool: Add is_cold_func() helper Josh Poimboeuf
2026-05-01 10:43   ` Song Liu
2026-05-05 11:26   ` Miroslav Benes
2026-05-01  4:08 ` [PATCH v2 39/53] objtool/klp: Extricate checksum calculation from validate_branch() Josh Poimboeuf
2026-05-05 11:43   ` Miroslav Benes
2026-05-01  4:08 ` [PATCH v2 40/53] objtool: Consolidate file decoding into decode_file() Josh Poimboeuf
2026-05-05 11:43   ` Miroslav Benes
2026-05-01  4:08 ` [PATCH v2 41/53] objtool/klp: Add "objtool klp checksum" subcommand Josh Poimboeuf
2026-05-05 11:43   ` Miroslav Benes
2026-05-01  4:08 ` [PATCH v2 42/53] klp-build: Use " Josh Poimboeuf
2026-05-05 11:58   ` Miroslav Benes
2026-05-01  4:08 ` [PATCH v2 43/53] objtool/klp: Remove "objtool --checksum" Josh Poimboeuf
2026-05-05 11:59   ` Miroslav Benes
2026-05-01  4:08 ` [PATCH v2 44/53] klp-build: Validate short-circuit prerequisites Josh Poimboeuf
2026-05-01 10:49   ` Song Liu
2026-05-05 12:00   ` Miroslav Benes
2026-05-01  4:08 ` [PATCH v2 45/53] objtool/klp: Calculate object checksums Josh Poimboeuf
2026-05-01 10:53   ` Song Liu
2026-05-05 12:07   ` Miroslav Benes
2026-05-01  4:08 ` [PATCH v2 46/53] objtool/klp: Rewrite symbol correlation algorithm Josh Poimboeuf
2026-05-01 12:07   ` Song Liu
2026-05-05 13:07   ` Miroslav Benes
2026-05-01  4:08 ` [PATCH v2 47/53] objtool/klp: Add correlation debugging output Josh Poimboeuf
2026-05-05 13:28   ` Miroslav Benes
2026-05-01  4:08 ` [PATCH v2 48/53] objtool: Add insn_sym() helper Josh Poimboeuf
2026-05-01 12:11   ` Song Liu
2026-05-01  4:08 ` [PATCH v2 49/53] objtool/klp: Fix position-dependent checksums for non-relocated jumps/calls Josh Poimboeuf
2026-05-01 12:16   ` Song Liu
2026-05-01  4:08 ` [PATCH v2 50/53] objtool: Grow __cfi_* prefix symbols for all CFI+CALL_PADDING Josh Poimboeuf
2026-05-01  4:08 ` [PATCH v2 51/53] objtool/klp: Fix kCFI prefix finding/cloning Josh Poimboeuf
2026-05-01 12:17   ` Song Liu
2026-05-01  4:08 ` [PATCH v2 52/53] objtool: Improve and simplify prefix symbol detection Josh Poimboeuf
2026-05-01  4:08 ` [PATCH v2 53/53] objtool/klp: Cache dont_correlate() result Josh Poimboeuf
2026-05-05 13:40   ` Miroslav Benes
2026-05-01 18:47 ` [PATCH v2 00/53] objtool/klp: Some klp-build fixes and improvements Josh Poimboeuf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=07de8098fd8981321baab0ff552f65aa2cfc31ec.1777575752.git.jpoimboe@kernel.org \
    --to=jpoimboe@kernel.org \
    --cc=joe.lawrence@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=live-patching@vger.kernel.org \
    --cc=mbenes@suse.cz \
    --cc=peterz@infradead.org \
    --cc=pmladek@suse.com \
    --cc=song@kernel.org \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox