From: Song Liu <song@kernel.org>
To: live-patching@vger.kernel.org
Cc: jpoimboe@kernel.org, peterz@infradead.org, jikos@kernel.org,
mbenes@suse.cz, pmladek@suse.com, joe.lawrence@redhat.com,
puranjay@kernel.org, kernel-team@meta.com,
Song Liu <song@kernel.org>
Subject: [PATCH v2 57/58] objtool/klp: Add test for Clang switch jump tables
Date: Sun, 13 Sep 2026 23:25:13 -0700 [thread overview]
Message-ID: <20260914062514.926997-58-song@kernel.org> (raw)
In-Reply-To: <20260914062514.926997-1-song@kernel.org>
For a dense enough switch Clang emits the targets as a table in
.rodata..Lswitch.table.<function> -- named after the function but not part
of it. The patched function indexes into that table, so a clone which does
not bring it along jumps through whatever the kernel's copy holds, which
after a patch that changed the switch is the wrong set of targets. An
indirect jump to a stale address reports nothing at build or load time.
The fixture asserts its own premise twice over, since both halves depend on
what this Clang chose to do: that a table was built rather than a chain of
comparisons, and that the added case actually changed it.
objtool has no switch-specific code -- the table is carried by the general
mechanism for data a cloned function references -- so this guards that
mechanism reaching an easily-mishandled shape rather than a particular
line, and the test says so. Making the table uncorrelated, the nearest
available sabotage, does not change the outcome.
Assisted-by: Claude:claude-opus-4
Based-on-test-by: Joe Lawrence <joe.lawrence@redhat.com>
Assisted-by: Claude:claude-opus-5
Signed-off-by: Song Liu <song@kernel.org>
---
.../tests/generic/fixtures/switch_rodata.c | 31 +++++++++++
.../tests/generic/test-switch-rodata.sh | 53 +++++++++++++++++++
2 files changed, 84 insertions(+)
create mode 100644 tools/objtool/tests/generic/fixtures/switch_rodata.c
create mode 100755 tools/objtool/tests/generic/test-switch-rodata.sh
diff --git a/tools/objtool/tests/generic/fixtures/switch_rodata.c b/tools/objtool/tests/generic/fixtures/switch_rodata.c
new file mode 100644
index 000000000000..817ddac92d81
--- /dev/null
+++ b/tools/objtool/tests/generic/fixtures/switch_rodata.c
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * A switch dense enough that Clang builds a jump table for it, in a section of
+ * its own: .rodata..Lswitch.table.<function>.
+ *
+ * The table belongs to the function and has to travel with it. It is named
+ * after the function but is not part of it, so klp diff has to associate the
+ * two rather than treating the table as unrelated data.
+ *
+ * The patch adds a case, which changes the table's contents and length.
+ */
+
+static const char __modinfo[]
+ __attribute__((section(".modinfo"), used, aligned(1))) = "\0name=vmlinux";
+const char *status_to_string(unsigned int c)
+{
+ switch (c) {
+ case 0: return "idle";
+ case 1: return "running";
+ case 2: return "stopped";
+ case 3: return "error";
+ case 4: return "paused";
+ case 5: return "waiting";
+ case 6: return "starting";
+ case 7: return "stopping";
+#ifdef PATCHED
+ case 8: return "completed";
+#endif
+ }
+ return "unknown";
+}
diff --git a/tools/objtool/tests/generic/test-switch-rodata.sh b/tools/objtool/tests/generic/test-switch-rodata.sh
new file mode 100755
index 000000000000..fb27e96c65f6
--- /dev/null
+++ b/tools/objtool/tests/generic/test-switch-rodata.sh
@@ -0,0 +1,53 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+#
+# A Clang switch jump table travels with the function it belongs to.
+#
+# For a dense enough switch Clang emits the targets as a table in
+# .rodata..Lswitch.table.<function>, named after the function but not part of
+# it. klp diff has to associate the two: the patched function indexes into
+# that table, so a clone which does not bring it along jumps through whatever
+# the kernel's copy holds -- which, when the patch changed the switch, is the
+# wrong set of targets.
+#
+# That is an indirect jump to a stale address, not a missing symbol, so nothing
+# reports it at build or load time.
+#
+# objtool has no switch-specific code: the table is carried by the general
+# mechanism for data a cloned function references. So this is a regression
+# test on that mechanism reaching a shape it is easy to get wrong, not a guard
+# on a particular line -- making the table uncorrelated, the nearest sabotage,
+# does not change the outcome.
+#
+# Covers the same ground as corpus/x86_64-llvm-switch-rodata/
+# clang-switch-rodata-assoc in Joe Lawrence's klp-build unit test corpus.
+
+. "$(dirname "$0")/../lib.sh"
+
+clang_only "only Clang emits switch jump tables in their own section"
+
+setup
+build_pair switch_rodata.c
+
+# The premise: this Clang really did build a table rather than a chain of
+# comparisons, and the added case really did change it.
+tbl=.rodata..Lswitch.table.status_to_string
+has_input_section orig.o "$tbl" ||
+ probe_skip "this clang built no jump table for the switch"
+# readelf prefixes each line with "[nn]", which splits into one or two fields
+# depending on the index, so strip it before counting columns.
+tbl_size()
+{
+ in_sections "$1" | sed 's/^ *\[[ 0-9]*\] *//' |
+ awk -v s="$tbl" '$1 == s { print $5 }'
+}
+[ "$(tbl_size orig.o)" != "$(tbl_size patched.o)" ] ||
+ fail "fixture's added case did not change the jump table"
+
+run_diff
+
+assert_patched status_to_string
+assert_section "$tbl"
+assert_reloc_sym .text.status_to_string "$tbl"
+
+pass "Clang switch jump table carried with the function it belongs to"
--
2.53.0-Meta
next prev parent reply other threads:[~2026-09-14 6:30 UTC|newest]
Thread overview: 88+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-14 6:24 [PATCH v2 00/58] Unit test framework for klp-build toolchain Song Liu
2026-09-14 6:24 ` [PATCH v2 01/58] objtool: Add test harness for the klp subcommands Song Liu
2026-09-14 6:24 ` [PATCH v2 02/58] objtool/klp: Check the klp test environment once, before any test Song Liu
2026-09-14 6:37 ` sashiko-bot
2026-09-14 18:39 ` Song Liu
2026-09-14 6:24 ` [PATCH v2 03/58] objtool/klp: Group the klp tests by architecture Song Liu
2026-09-14 6:24 ` [PATCH v2 04/58] objtool/klp: Classify klp test outcomes Song Liu
2026-09-14 6:39 ` sashiko-bot
2026-09-14 18:50 ` Song Liu
2026-09-14 6:24 ` [PATCH v2 05/58] objtool/klp: Build klp test fixtures through the harness Song Liu
2026-09-14 6:41 ` sashiko-bot
2026-09-14 19:52 ` Song Liu
2026-09-14 6:24 ` [PATCH v2 06/58] objtool/klp: Grow the klp test harness vocabulary Song Liu
2026-09-14 6:41 ` sashiko-bot
2026-09-14 20:37 ` Song Liu
2026-09-14 6:24 ` [PATCH v2 07/58] objtool/klp: Give each run one working directory, one per test inside it Song Liu
2026-09-14 6:24 ` [PATCH v2 08/58] objtool/klp: Run the klp tests under set -u Song Liu
2026-09-14 6:24 ` [PATCH v2 09/58] objtool/klp: Document the klp test harness Song Liu
2026-09-14 6:24 ` [PATCH v2 10/58] objtool: Keep failing test workdirs by default Song Liu
2026-09-14 6:37 ` sashiko-bot
2026-09-14 18:25 ` Song Liu
2026-09-14 6:24 ` [PATCH v2 11/58] objtool: Forward toolchain variables to the klp test runner Song Liu
2026-09-14 6:39 ` sashiko-bot
2026-09-14 20:48 ` Song Liu
2026-09-14 6:24 ` [PATCH v2 12/58] objtool/klp: Add test for rejecting changed data Song Liu
2026-09-14 6:24 ` [PATCH v2 13/58] objtool/klp: Add test for newly introduced data Song Liu
2026-09-14 6:38 ` sashiko-bot
2026-09-14 20:47 ` Song Liu
2026-09-14 6:24 ` [PATCH v2 14/58] objtool/klp: Add test for newly introduced functions Song Liu
2026-09-14 6:24 ` [PATCH v2 15/58] objtool/klp: Add test for static local correlation Song Liu
2026-09-14 6:24 ` [PATCH v2 16/58] objtool/klp: Add test for cold function halves Song Liu
2026-09-14 6:38 ` sashiko-bot
2026-09-14 20:55 ` Song Liu
2026-09-14 6:24 ` [PATCH v2 17/58] objtool/klp: Add test for special section extraction Song Liu
2026-09-14 6:24 ` [PATCH v2 18/58] objtool/klp: Add test for selective " Song Liu
2026-09-14 6:24 ` [PATCH v2 19/58] objtool/klp: Add test for jump table key relocations Song Liu
2026-09-14 6:46 ` sashiko-bot
2026-09-14 20:55 ` Song Liu
2026-09-14 6:24 ` [PATCH v2 20/58] objtool/klp: Add test for rejecting module-owned static branch keys Song Liu
2026-09-14 6:24 ` [PATCH v2 21/58] objtool/klp: Add test for rejecting module-owned static call keys Song Liu
2026-09-14 6:24 ` [PATCH v2 22/58] objtool/klp: Add test for symids in discarded sections Song Liu
2026-09-14 6:24 ` [PATCH v2 23/58] objtool/klp: Add test for rejecting references to init code/data Song Liu
2026-09-14 6:24 ` [PATCH v2 24/58] objtool/klp: Add test for correlation across ThinLTO name mangling Song Liu
2026-09-14 6:24 ` [PATCH v2 25/58] objtool/klp: Add test for objects without .modinfo Song Liu
2026-09-14 6:24 ` [PATCH v2 26/58] objtool/klp: Add test for unchecksummed input Song Liu
2026-09-14 6:24 ` [PATCH v2 27/58] objtool/klp: Add klp diff and post-link regression tests Song Liu
2026-09-14 6:24 ` [PATCH v2 28/58] objtool/klp: Add test for klp reloc section naming in module objects Song Liu
2026-09-14 6:24 ` [PATCH v2 29/58] objtool/klp: Add test for vmlinux relocs in a patched module Song Liu
2026-09-14 6:24 ` [PATCH v2 30/58] objtool/klp: Add test for Module.symvers path normalization Song Liu
2026-09-14 6:24 ` [PATCH v2 31/58] objtool/klp: Add test for the contents of the klp_funcs list Song Liu
2026-09-14 6:46 ` sashiko-bot
2026-09-14 21:00 ` Song Liu
2026-09-14 6:24 ` [PATCH v2 32/58] objtool/klp: Add test for EXPORT_SYMBOL_FOR_MODULES references Song Liu
2026-09-14 6:45 ` sashiko-bot
2026-09-14 21:04 ` Song Liu
2026-09-14 6:24 ` [PATCH v2 33/58] objtool/klp: Add test for new references to exported symbols Song Liu
2026-09-14 6:24 ` [PATCH v2 34/58] objtool/klp: Add test for empty x86 alternative replacements Song Liu
2026-09-14 6:24 ` [PATCH v2 35/58] objtool/klp: Add test for recorded checksum values Song Liu
2026-09-14 6:24 ` [PATCH v2 36/58] objtool/klp: Add test for position-independent checksums Song Liu
2026-09-14 6:46 ` sashiko-bot
2026-09-14 21:42 ` Song Liu
2026-09-14 6:24 ` [PATCH v2 37/58] objtool/klp: Add test for sympos in module objects Song Liu
2026-09-14 6:49 ` sashiko-bot
2026-09-14 21:08 ` Song Liu
2026-09-14 6:24 ` [PATCH v2 38/58] objtool/klp: Add test for sympos resolved against a linked vmlinux Song Liu
2026-09-14 6:24 ` [PATCH v2 39/58] objtool/klp: Add test for static locals which must not be correlated Song Liu
2026-09-14 6:24 ` [PATCH v2 40/58] objtool/klp: Add test for __bug_table, __ex_table and __mcount_loc extraction Song Liu
2026-09-14 6:24 ` [PATCH v2 41/58] objtool/klp: Add test for kCFI prefix symbols and traps Song Liu
2026-09-14 6:24 ` [PATCH v2 42/58] objtool/klp: Add test for symbols whose linkage the patch changes Song Liu
2026-09-14 6:47 ` sashiko-bot
2026-09-14 6:24 ` [PATCH v2 43/58] objtool/klp: Test rejection of a file-local static branch key Song Liu
2026-09-14 6:25 ` [PATCH v2 44/58] objtool/klp: Test a hand-built livepatch module's static call keys Song Liu
2026-09-14 6:25 ` [PATCH v2 45/58] objtool/klp: Test text annotations on alternative replacements Song Liu
2026-09-14 6:25 ` [PATCH v2 46/58] objtool/klp: Add test for data object checksums Song Liu
2026-09-14 6:25 ` [PATCH v2 47/58] objtool/klp: Add test for symbols with no checksum entry of their own Song Liu
2026-09-14 6:48 ` sashiko-bot
2026-09-14 22:08 ` Song Liu
2026-09-14 6:25 ` [PATCH v2 48/58] objtool/klp: Add test for a static branch introduced by the patch Song Liu
2026-09-14 6:25 ` [PATCH v2 49/58] objtool/klp: Add test for tracepoint and pr_debug static branch keys Song Liu
2026-09-14 6:25 ` [PATCH v2 50/58] objtool/klp: Add test for a static call introduced by the patch Song Liu
2026-09-14 6:25 ` [PATCH v2 51/58] objtool/klp: Add test for instruction operand checksums Song Liu
2026-09-14 6:25 ` [PATCH v2 52/58] objtool/klp: Add test for alternative replacement code in checksums Song Liu
2026-09-14 6:25 ` [PATCH v2 53/58] objtool/klp: Add test for the alignment of cloned data sections Song Liu
2026-09-14 6:25 ` [PATCH v2 54/58] objtool/klp: Add test for a patch which strips a data annotation Song Liu
2026-09-14 6:25 ` [PATCH v2 55/58] objtool/klp: Add test for absolute and __ADDRESSABLE symbols Song Liu
2026-09-14 6:25 ` [PATCH v2 56/58] objtool/klp: Add test for UBSAN metadata in an unchanged function Song Liu
2026-09-14 6:25 ` Song Liu [this message]
2026-09-14 6:25 ` [PATCH v2 58/58] objtool/klp: Add test for ThinLTO symbols sharing a demangled name Song Liu
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=20260914062514.926997-58-song@kernel.org \
--to=song@kernel.org \
--cc=jikos@kernel.org \
--cc=joe.lawrence@redhat.com \
--cc=jpoimboe@kernel.org \
--cc=kernel-team@meta.com \
--cc=live-patching@vger.kernel.org \
--cc=mbenes@suse.cz \
--cc=peterz@infradead.org \
--cc=pmladek@suse.com \
--cc=puranjay@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.