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 41/53] objtool/klp: Add "objtool klp checksum" subcommand
Date: Thu, 30 Apr 2026 21:08:29 -0700 [thread overview]
Message-ID: <ce954af546c49aab9a02de2fa85fb6565ebd3aef.1777575752.git.jpoimboe@kernel.org> (raw)
In-Reply-To: <cover.1777575752.git.jpoimboe@kernel.org>
Move the checksum functionality out of the main objtool command into a
new "objtool klp checksum" subcommand.
This has the benefit of making the code (and the patch generation
process itself) more modular.
For bisectability, both "objtool --checksum" and "objtool klp checksum"
work for now. The former will be removed after klp-build has been
converted to use the new subcommand.
Acked-by: Song Liu <song@kernel.org>
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
---
tools/objtool/Build | 2 +-
tools/objtool/builtin-klp.c | 1 +
tools/objtool/check.c | 205 +-----------------
tools/objtool/include/objtool/check.h | 6 +
tools/objtool/include/objtool/checksum.h | 4 +
tools/objtool/include/objtool/klp.h | 1 +
tools/objtool/klp-checksum.c | 253 +++++++++++++++++++++++
tools/objtool/klp-diff.c | 2 +-
8 files changed, 269 insertions(+), 205 deletions(-)
create mode 100644 tools/objtool/klp-checksum.c
diff --git a/tools/objtool/Build b/tools/objtool/Build
index 600da051af12..93a37b0dfd31 100644
--- a/tools/objtool/Build
+++ b/tools/objtool/Build
@@ -12,7 +12,7 @@ objtool-$(BUILD_DISAS) += disas.o
objtool-$(BUILD_DISAS) += trace.o
objtool-$(BUILD_ORC) += orc_gen.o orc_dump.o
-objtool-$(BUILD_KLP) += builtin-klp.o klp-diff.o klp-post-link.o
+objtool-$(BUILD_KLP) += builtin-klp.o klp-checksum.o klp-diff.o klp-post-link.o
objtool-y += libstring.o
objtool-y += libctype.o
diff --git a/tools/objtool/builtin-klp.c b/tools/objtool/builtin-klp.c
index 56d5a5b92f72..58c3b9bda3eb 100644
--- a/tools/objtool/builtin-klp.c
+++ b/tools/objtool/builtin-klp.c
@@ -13,6 +13,7 @@ struct subcmd {
};
static struct subcmd subcmds[] = {
+ { "checksum", "Generate per-function checksums", cmd_klp_checksum, },
{ "diff", "Generate binary diff of two object files", cmd_klp_diff, },
{ "post-link", "Finalize klp symbols/relocs after module linking", cmd_klp_post_link, },
};
diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index 49171ddc6f54..3e5d335d0e29 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -64,8 +64,8 @@ struct instruction *next_insn_same_sec(struct objtool_file *file,
return insn;
}
-static struct instruction *next_insn_same_func(struct objtool_file *file,
- struct instruction *insn)
+struct instruction *next_insn_same_func(struct objtool_file *file,
+ struct instruction *insn)
{
struct instruction *next = next_insn_same_sec(file, insn);
struct symbol *func = insn_func(insn);
@@ -113,10 +113,6 @@ static struct instruction *prev_insn_same_sym(struct objtool_file *file,
for_each_sec(file->elf, __sec) \
sec_for_each_insn(file, __sec, insn)
-#define func_for_each_insn(file, func, insn) \
- for (insn = find_insn(file, func->sec, func->offset); \
- insn; \
- insn = next_insn_same_func(file, insn))
#define sym_for_each_insn(file, sym, insn) \
for (insn = find_insn(file, sym->sec, sym->offset); \
@@ -1023,56 +1019,6 @@ static int create_direct_call_sections(struct objtool_file *file)
return 0;
}
-#ifdef BUILD_KLP
-static int create_sym_checksum_section(struct objtool_file *file)
-{
- struct section *sec;
- struct symbol *sym;
- unsigned int idx = 0;
- struct sym_checksum *checksum;
- size_t entsize = sizeof(struct sym_checksum);
-
- sec = find_section_by_name(file->elf, ".discard.sym_checksum");
- if (sec) {
- if (!opts.dryrun)
- WARN("file already has .discard.sym_checksum section, skipping");
-
- return 0;
- }
-
- for_each_sym(file->elf, sym)
- if (sym->csum.checksum)
- idx++;
-
- sec = elf_create_section_pair(file->elf, ".discard.sym_checksum", entsize,
- idx, idx);
- if (!sec)
- return -1;
-
- idx = 0;
- for_each_sym(file->elf, sym) {
- if (!sym->csum.checksum)
- continue;
-
- if (!elf_init_reloc(file->elf, sec->rsec, idx, idx * entsize,
- sym, 0, R_TEXT64))
- return -1;
-
- checksum = (struct sym_checksum *)sec->data->d_buf + idx;
- checksum->addr = 0; /* reloc */
- checksum->checksum = sym->csum.checksum;
-
- mark_sec_changed(file->elf, sec, true);
-
- idx++;
- }
-
- return 0;
-}
-#else
-static int create_sym_checksum_section(struct objtool_file *file) { return -EINVAL; }
-#endif
-
/*
* Warnings shouldn't be reported for ignored functions.
*/
@@ -3672,153 +3618,6 @@ static bool skip_alt_group(struct instruction *insn)
return alt_insn->type == INSN_CLAC || alt_insn->type == INSN_STAC;
}
-#ifdef BUILD_KLP
-static int checksum_debug_init(struct objtool_file *file)
-{
- char *dup, *s;
-
- if (!opts.debug_checksum)
- return 0;
-
- dup = strdup(opts.debug_checksum);
- if (!dup) {
- ERROR_GLIBC("strdup");
- return -1;
- }
-
- s = dup;
- while (*s) {
- bool found = false;
- struct symbol *sym;
- char *comma;
-
- comma = strchr(s, ',');
- if (comma)
- *comma = '\0';
-
- for_each_sym_by_name(file->elf, s, sym) {
- if (!is_func_sym(sym))
- continue;
- sym->debug_checksum = 1;
- found = true;
- }
-
- if (!found)
- WARN("--debug-checksum: can't find '%s'", s);
-
- if (!comma)
- break;
-
- s = comma + 1;
- }
-
- free(dup);
- return 0;
-}
-
-static void checksum_update_insn(struct objtool_file *file, struct symbol *func,
- struct instruction *insn)
-{
- struct reloc *reloc = insn_reloc(file, insn);
- struct alternative *alt;
- unsigned long offset;
- struct symbol *sym;
- static bool in_alt;
-
- if (insn->fake)
- return;
-
- checksum_update(func, insn, insn->sec->data->d_buf + insn->offset, insn->len);
-
- if (!reloc) {
- struct symbol *call_dest = insn_call_dest(insn);
-
- if (call_dest)
- checksum_update(func, insn, call_dest->demangled_name,
- strlen(call_dest->demangled_name));
- goto alts;
- }
-
- sym = reloc->sym;
- offset = arch_insn_adjusted_addend(insn, reloc);
-
- if (is_string_sec(sym->sec)) {
- char *str;
-
- str = sym->sec->data->d_buf + sym->offset + offset;
- checksum_update(func, insn, str, strlen(str));
- goto alts;
- }
-
- if (is_sec_sym(sym)) {
- sym = find_symbol_containing(reloc->sym->sec, offset);
- if (!sym)
- goto alts;
-
- offset -= sym->offset;
- }
-
- checksum_update(func, insn, sym->demangled_name, strlen(sym->demangled_name));
- checksum_update(func, insn, &offset, sizeof(offset));
-
-alts:
- for (alt = insn->alts; alt; alt = alt->next) {
- struct alt_group *alt_group = alt->insn->alt_group;
-
- /* Prevent __ex_table recursion, e.g. LOAD_SEGMENT() */
- if (in_alt)
- break;
- in_alt = true;
-
- checksum_update(func, insn, &alt->type, sizeof(alt->type));
-
- if (alt_group && alt_group->orig_group) {
- struct instruction *alt_insn;
-
- checksum_update(func, insn, &alt_group->feature, sizeof(alt_group->feature));
-
- for (alt_insn = alt->insn; alt_insn; alt_insn = next_insn_same_sec(file, alt_insn)) {
- checksum_update_insn(file, func, alt_insn);
- if (!alt_group->last_insn || alt_insn == alt_group->last_insn)
- break;
- }
- } else {
- checksum_update_insn(file, func, alt->insn);
- }
-
- in_alt = false;
- }
-}
-
-static int calculate_checksums(struct objtool_file *file)
-{
- struct instruction *insn;
- struct symbol *func;
-
- if (checksum_debug_init(file))
- return -1;
-
- for_each_sym(file->elf, func) {
- /*
- * Skip cold subfunctions and aliases: they share the
- * parent's checksum via func_for_each_insn() which
- * follows func->cfunc into the cold subfunction.
- */
- if (!is_func_sym(func) || is_cold_func(func) ||
- is_alias_sym(func) || !func->len)
- continue;
-
- checksum_init(func);
-
- func_for_each_insn(file, func, insn)
- checksum_update_insn(file, func, insn);
-
- checksum_finish(func);
- }
- return 0;
-}
-#endif /* BUILD_KLP */
-
static int validate_branch(struct objtool_file *file, struct symbol *func,
struct instruction *insn, struct insn_state state);
static int do_validate_branch(struct objtool_file *file, struct symbol *func,
diff --git a/tools/objtool/include/objtool/check.h b/tools/objtool/include/objtool/check.h
index 6489e52ea2f2..eea64728d39b 100644
--- a/tools/objtool/include/objtool/check.h
+++ b/tools/objtool/include/objtool/check.h
@@ -144,6 +144,12 @@ struct instruction *find_insn(struct objtool_file *file,
struct section *sec, unsigned long offset);
struct instruction *next_insn_same_sec(struct objtool_file *file, struct instruction *insn);
+struct instruction *next_insn_same_func(struct objtool_file *file, struct instruction *insn);
+
+#define func_for_each_insn(file, func, insn) \
+ for (insn = find_insn(file, func->sec, func->offset); \
+ insn; \
+ insn = next_insn_same_func(file, insn))
#define sec_for_each_insn(file, _sec, insn) \
for (insn = find_insn(file, _sec, 0); \
diff --git a/tools/objtool/include/objtool/checksum.h b/tools/objtool/include/objtool/checksum.h
index 3f25df90305d..be4eb7dfe6f2 100644
--- a/tools/objtool/include/objtool/checksum.h
+++ b/tools/objtool/include/objtool/checksum.h
@@ -31,9 +31,13 @@ static inline void checksum_finish(struct symbol *func)
}
}
+int calculate_checksums(struct objtool_file *file);
+int create_sym_checksum_section(struct objtool_file *file);
+
#else /* !BUILD_KLP */
static inline int calculate_checksums(struct objtool_file *file) { return -ENOSYS; }
+static inline int create_sym_checksum_section(struct objtool_file *file) { return -EINVAL; }
#endif /* !BUILD_KLP */
diff --git a/tools/objtool/include/objtool/klp.h b/tools/objtool/include/objtool/klp.h
index e32e5e8bc631..6f60cf05db86 100644
--- a/tools/objtool/include/objtool/klp.h
+++ b/tools/objtool/include/objtool/klp.h
@@ -29,6 +29,7 @@ struct klp_reloc {
u32 type;
};
+int cmd_klp_checksum(int argc, const char **argv);
int cmd_klp_diff(int argc, const char **argv);
int cmd_klp_post_link(int argc, const char **argv);
diff --git a/tools/objtool/klp-checksum.c b/tools/objtool/klp-checksum.c
new file mode 100644
index 000000000000..e4a910f3211c
--- /dev/null
+++ b/tools/objtool/klp-checksum.c
@@ -0,0 +1,253 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include <string.h>
+#include <subcmd/parse-options.h>
+
+#include <objtool/arch.h>
+#include <objtool/builtin.h>
+#include <objtool/check.h>
+#include <objtool/elf.h>
+#include <objtool/klp.h>
+#include <objtool/objtool.h>
+#include <objtool/warn.h>
+#include <objtool/checksum.h>
+
+static int checksum_debug_init(struct objtool_file *file)
+{
+ char *dup, *s;
+
+ if (!opts.debug_checksum)
+ return 0;
+
+ dup = strdup(opts.debug_checksum);
+ if (!dup) {
+ ERROR_GLIBC("strdup");
+ return -1;
+ }
+
+ s = dup;
+ while (*s) {
+ bool found = false;
+ struct symbol *sym;
+ char *comma;
+
+ comma = strchr(s, ',');
+ if (comma)
+ *comma = '\0';
+
+ for_each_sym_by_name(file->elf, s, sym) {
+ if (!is_func_sym(sym))
+ continue;
+ sym->debug_checksum = 1;
+ found = true;
+ }
+
+ if (!found)
+ WARN("--debug-checksum: can't find '%s'", s);
+
+ if (!comma)
+ break;
+
+ s = comma + 1;
+ }
+
+ free(dup);
+ return 0;
+}
+
+static void checksum_update_insn(struct objtool_file *file, struct symbol *func,
+ struct instruction *insn)
+{
+ struct reloc *reloc = insn_reloc(file, insn);
+ struct alternative *alt;
+ unsigned long offset;
+ struct symbol *sym;
+ static bool in_alt;
+
+ if (insn->fake)
+ return;
+
+ checksum_update(func, insn, insn->sec->data->d_buf + insn->offset, insn->len);
+
+ if (!reloc) {
+ struct symbol *call_dest = insn_call_dest(insn);
+
+ if (call_dest)
+ checksum_update(func, insn, call_dest->demangled_name,
+ strlen(call_dest->demangled_name));
+ goto alts;
+ }
+
+ sym = reloc->sym;
+ offset = arch_insn_adjusted_addend(insn, reloc);
+
+ if (is_string_sec(sym->sec)) {
+ char *str;
+
+ str = sym->sec->data->d_buf + sym->offset + offset;
+ checksum_update(func, insn, str, strlen(str));
+ goto alts;
+ }
+
+ if (is_sec_sym(sym)) {
+ sym = find_symbol_containing(reloc->sym->sec, offset);
+ if (!sym)
+ goto alts;
+
+ offset -= sym->offset;
+ }
+
+ checksum_update(func, insn, sym->demangled_name, strlen(sym->demangled_name));
+ checksum_update(func, insn, &offset, sizeof(offset));
+
+alts:
+ for (alt = insn->alts; alt; alt = alt->next) {
+ struct alt_group *alt_group = alt->insn->alt_group;
+
+ /* Prevent __ex_table recursion, e.g. LOAD_SEGMENT() */
+ if (in_alt)
+ break;
+ in_alt = true;
+
+ checksum_update(func, insn, &alt->type, sizeof(alt->type));
+
+ if (alt_group && alt_group->orig_group) {
+ struct instruction *alt_insn;
+
+ checksum_update(func, insn, &alt_group->feature, sizeof(alt_group->feature));
+
+ for (alt_insn = alt->insn; alt_insn; alt_insn = next_insn_same_sec(file, alt_insn)) {
+ checksum_update_insn(file, func, alt_insn);
+ if (!alt_group->last_insn || alt_insn == alt_group->last_insn)
+ break;
+ }
+ } else {
+ checksum_update_insn(file, func, alt->insn);
+ }
+
+ in_alt = false;
+ }
+}
+
+int calculate_checksums(struct objtool_file *file)
+{
+ struct instruction *insn;
+ struct symbol *func;
+
+ if (checksum_debug_init(file))
+ return -1;
+
+ for_each_sym(file->elf, func) {
+ /*
+ * Skip cold subfunctions and aliases: they share the
+ * parent's checksum via func_for_each_insn() which
+ * follows func->cfunc into the cold subfunction.
+ */
+ if (!is_func_sym(func) || is_cold_func(func) ||
+ is_alias_sym(func) || !func->len)
+ continue;
+
+ checksum_init(func);
+
+ func_for_each_insn(file, func, insn)
+ checksum_update_insn(file, func, insn);
+
+ checksum_finish(func);
+ }
+ return 0;
+}
+
+int create_sym_checksum_section(struct objtool_file *file)
+{
+ struct section *sec;
+ struct symbol *sym;
+ unsigned int idx = 0;
+ struct sym_checksum *checksum;
+ size_t entsize = sizeof(struct sym_checksum);
+
+ sec = find_section_by_name(file->elf, ".discard.sym_checksum");
+ if (sec) {
+ if (!opts.dryrun)
+ WARN("file already has .discard.sym_checksum section, skipping");
+
+ return 0;
+ }
+
+ for_each_sym(file->elf, sym)
+ if (sym->csum.checksum)
+ idx++;
+
+ sec = elf_create_section_pair(file->elf, ".discard.sym_checksum", entsize,
+ idx, idx);
+ if (!sec)
+ return -1;
+
+ idx = 0;
+ for_each_sym(file->elf, sym) {
+ if (!sym->csum.checksum)
+ continue;
+
+ if (!elf_init_reloc(file->elf, sec->rsec, idx, idx * entsize,
+ sym, 0, R_TEXT64))
+ return -1;
+
+ checksum = (struct sym_checksum *)sec->data->d_buf + idx;
+ checksum->addr = 0; /* reloc */
+ checksum->checksum = sym->csum.checksum;
+
+ mark_sec_changed(file->elf, sec, true);
+
+ idx++;
+ }
+
+ return 0;
+}
+
+static const char * const klp_checksum_usage[] = {
+ "objtool klp checksum [<options>] file.o",
+ NULL,
+};
+
+int cmd_klp_checksum(int argc, const char **argv)
+{
+ struct objtool_file *file;
+ int ret;
+
+ const struct option options[] = {
+ OPT_STRING(0, "debug-checksum", &opts.debug_checksum, "funcs", "enable checksum debug output"),
+ OPT_BOOLEAN(0, "dry-run", &opts.dryrun, "don't write modifications"),
+ OPT_END(),
+ };
+
+ argc = parse_options(argc, argv, options, klp_checksum_usage, 0);
+ if (argc != 1)
+ usage_with_options(klp_checksum_usage, options);
+
+ opts.checksum = true;
+
+ objname = argv[0];
+
+ file = objtool_open_read(objname);
+ if (!file)
+ return 1;
+
+ ret = decode_file(file);
+ if (ret)
+ goto out;
+
+ ret = calculate_checksums(file);
+ if (ret)
+ goto out;
+
+ ret = create_sym_checksum_section(file);
+
+out:
+ free_insns(file);
+
+ if (ret)
+ return ret;
+
+ if (!opts.dryrun && file->elf->changed && elf_write(file->elf))
+ return 1;
+
+ return elf_close(file->elf);
+}
diff --git a/tools/objtool/klp-diff.c b/tools/objtool/klp-diff.c
index 8728dda1e08c..95359ad336bb 100644
--- a/tools/objtool/klp-diff.c
+++ b/tools/objtool/klp-diff.c
@@ -166,7 +166,7 @@ static int read_sym_checksums(struct elf *elf)
sec = find_section_by_name(elf, ".discard.sym_checksum");
if (!sec) {
- ERROR("'%s' missing .discard.sym_checksum section, file not processed by 'objtool --checksum'?",
+ ERROR("'%s' missing .discard.sym_checksum section, file not processed by 'objtool klp checksum'?",
elf->name);
return -1;
}
--
2.53.0
next prev parent reply other threads:[~2026-05-01 4:09 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 ` [PATCH v2 19/53] objtool/klp: Fix pointer comparisons for rodata objects Josh Poimboeuf
2026-05-01 10:35 ` 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 ` Josh Poimboeuf [this message]
2026-05-05 11:43 ` [PATCH v2 41/53] objtool/klp: Add "objtool klp checksum" subcommand 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=ce954af546c49aab9a02de2fa85fb6565ebd3aef.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