[tip: objtool/urgent] objtool/klp: Fix detection of corrupt static branch/call entries

From: tip-bot2 for Josh Poimboeuf

Date: Mon Mar 09 2026 - 15:56:29 EST


The following commit has been merged into the objtool/urgent branch of tip:

Commit-ID: f9fb44b0ecefc1f218db56661ed66d4e8d67317d
Gitweb: https://git.kernel.org/tip/f9fb44b0ecefc1f218db56661ed66d4e8d67317d
Author: Josh Poimboeuf <jpoimboe@xxxxxxxxxx>
AuthorDate: Tue, 10 Feb 2026 13:50:09 -08:00
Committer: Josh Poimboeuf <jpoimboe@xxxxxxxxxx>
CommitterDate: Fri, 06 Mar 2026 07:47:10 -08:00

objtool/klp: Fix detection of corrupt static branch/call entries

Patching a function which references a static key living in a kernel
module is unsupported due to ordering issues inherent to late module
patching:

1) Load a livepatch module which has a __jump_table entry which needs
a klp reloc to reference static key K which lives in module M.

2) The __jump_table klp reloc does *not* get resolved because module M
is not yet loaded.

3) jump_label_add_module() corrupts memory (or causes a panic) when
dereferencing the uninitialized pointer to key K.

validate_special_section_klp_reloc() intends to prevent that from ever
happening by catching it at build time. However, it incorrectly assumes
the special section entry's reloc symbol references have already been
converted from section symbols to object symbols, causing the validation
to miss corruption in extracted static branch/call table entries.

Make sure the references have been properly converted before doing the
validation.

Fixes: dd590d4d57eb ("objtool/klp: Introduce klp diff subcommand for diffing object files")
Reported-by: Song Liu <song@xxxxxxxxxx>
Reviewed-and-tested-by: Song Liu <song@xxxxxxxxxx>
Link: https://patch.msgid.link/124ad747b751df0df1725eff89de8332e3fb26d6.1770759954.git.jpoimboe@xxxxxxxxxx
Signed-off-by: Josh Poimboeuf <jpoimboe@xxxxxxxxxx>
---
tools/objtool/klp-diff.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/tools/objtool/klp-diff.c b/tools/objtool/klp-diff.c
index 9f1f401..d94632e 100644
--- a/tools/objtool/klp-diff.c
+++ b/tools/objtool/klp-diff.c
@@ -1364,6 +1364,9 @@ static int validate_special_section_klp_reloc(struct elfs *e, struct symbol *sym
const char *sym_modname;
struct export *export;

+ if (convert_reloc_sym(e->patched, reloc))
+ continue;
+
/* Static branch/call keys are always STT_OBJECT */
if (reloc->sym->type != STT_OBJECT) {