From: Josh Poimboeuf <jpoimboe@kernel.org>
To: x86@kernel.org
Cc: linux-kernel@vger.kernel.org, Petr Mladek <pmladek@suse.com>,
Miroslav Benes <mbenes@suse.cz>,
Joe Lawrence <joe.lawrence@redhat.com>,
live-patching@vger.kernel.org, Song Liu <song@kernel.org>,
laokz <laokz@foxmail.com>, Jiri Kosina <jikos@kernel.org>,
Marcos Paulo de Souza <mpdesouza@suse.com>,
Weinan Liu <wnliu@google.com>,
Fazla Mehrab <a.mehrab@bytedance.com>,
Chen Zhongjin <chenzhongjin@huawei.com>,
Puranjay Mohan <puranjay@kernel.org>
Subject: [PATCH v2 56/62] objtool: Add base objtool support for livepatch modules
Date: Fri, 9 May 2025 13:17:20 -0700 [thread overview]
Message-ID: <ed05aca9028fa80d9f48ee88ebb80dc90c6a4194.1746821544.git.jpoimboe@kernel.org> (raw)
In-Reply-To: <cover.1746821544.git.jpoimboe@kernel.org>
In preparation for klp-build, enable "classic" objtool to work on
livepatch modules:
- Avoid duplicate symbol/section warnings for prefix symbols and the
.static_call_sites and __mcount_loc sections which may have already
been extracted by klp diff.
- Add __klp_funcs to the IBT function pointer section whitelist.
- Prevent KLP symbols from getting incorrectly classified as cold
subfunctions.
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
---
tools/objtool/check.c | 44 +++++++++++++++++++++----
tools/objtool/elf.c | 4 ++-
tools/objtool/include/objtool/elf.h | 1 +
tools/objtool/include/objtool/objtool.h | 2 +-
4 files changed, 43 insertions(+), 8 deletions(-)
diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index bc9bc37efa55..5bd1b8d000bd 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -3,6 +3,7 @@
* Copyright (C) 2015-2017 Josh Poimboeuf <jpoimboe@redhat.com>
*/
+#define _GNU_SOURCE /* memmem() */
#include <string.h>
#include <stdlib.h>
#include <inttypes.h>
@@ -627,6 +628,20 @@ static int init_pv_ops(struct objtool_file *file)
return 0;
}
+static bool is_livepatch_module(struct objtool_file *file)
+{
+ struct section *sec;
+
+ if (!opts.module)
+ return false;
+
+ sec = find_section_by_name(file->elf, ".modinfo");
+ if (!sec)
+ return false;
+
+ return memmem(sec->data->d_buf, sec_size(sec), "\0livepatch=Y", 12);
+}
+
static int create_static_call_sections(struct objtool_file *file)
{
struct static_call_site *site;
@@ -638,7 +653,12 @@ static int create_static_call_sections(struct objtool_file *file)
sec = find_section_by_name(file->elf, ".static_call_sites");
if (sec) {
- if (!opts.dryrun)
+ /*
+ * Livepatch modules may have already extracted the static call
+ * site entries to take advantage of vmlinux static call
+ * privileges.
+ */
+ if (!!opts.dryrun || !file->klp)
WARN("file already has .static_call_sites section, skipping");
return 0;
@@ -684,7 +704,7 @@ static int create_static_call_sections(struct objtool_file *file)
key_sym = find_symbol_by_name(file->elf, tmp);
if (!key_sym) {
- if (!opts.module) {
+ if (!opts.module || file->klp) {
ERROR("static_call: can't find static_call_key symbol: %s", tmp);
return -1;
}
@@ -911,7 +931,11 @@ static int create_mcount_loc_sections(struct objtool_file *file)
sec = find_section_by_name(file->elf, "__mcount_loc");
if (sec) {
- if (!opts.dryrun)
+ /*
+ * Livepatch modules have already extracted their __mcount_loc
+ * entries to cover the !CONFIG_FTRACE_MCOUNT_USE_OBJTOOL case.
+ */
+ if (!opts.dryrun && !file->klp)
WARN("file already has __mcount_loc section, skipping");
return 0;
@@ -2612,6 +2636,8 @@ static int decode_sections(struct objtool_file *file)
{
int ret;
+ file->klp = is_livepatch_module(file);
+
mark_rodata(file);
ret = init_pv_ops(file);
@@ -4285,8 +4311,13 @@ static int add_prefix_symbol(struct objtool_file *file, struct symbol *func)
if (offset < opts.prefix)
continue;
+ /*
+ * Ignore attempts to make duplicate symbols in livepatch
+ * modules. They've already extracted the prefix symbols
+ * except for the newly compiled init.c.
+ */
sym_pfx = elf_create_prefix_symbol(file->elf, func, opts.prefix);
- if (!sym_pfx) {
+ if (!sym_pfx && !file->klp) {
WARN("duplicate prefix symbol for %s\n", func->name);
return -1;
}
@@ -4621,6 +4652,7 @@ static int validate_ibt(struct objtool_file *file)
!strncmp(sec->name, ".debug", 6) ||
!strcmp(sec->name, ".altinstructions") ||
!strcmp(sec->name, ".ibt_endbr_seal") ||
+ !strcmp(sec->name, ".kcfi_traps") ||
!strcmp(sec->name, ".orc_unwind_ip") ||
!strcmp(sec->name, ".retpoline_sites") ||
!strcmp(sec->name, ".smp_locks") ||
@@ -4630,12 +4662,12 @@ static int validate_ibt(struct objtool_file *file)
!strcmp(sec->name, "__bug_table") ||
!strcmp(sec->name, "__ex_table") ||
!strcmp(sec->name, "__jump_table") ||
+ !strcmp(sec->name, "__klp_funcs") ||
!strcmp(sec->name, "__mcount_loc") ||
- !strcmp(sec->name, ".kcfi_traps") ||
!strcmp(sec->name, ".llvm.call-graph-profile") ||
!strcmp(sec->name, ".llvm_bb_addr_map") ||
!strcmp(sec->name, "__tracepoints") ||
- strstr(sec->name, "__patchable_function_entries"))
+ !strcmp(sec->name, "__patchable_function_entries"))
continue;
for_each_reloc(sec->rsec, reloc)
diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c
index de1d8554d979..ae1c852ff8d8 100644
--- a/tools/objtool/elf.c
+++ b/tools/objtool/elf.c
@@ -496,8 +496,10 @@ static int elf_add_symbol(struct elf *elf, struct symbol *sym)
(strstarts(sym->name, "__pfx") || strstarts(sym->name, "__cfi_")))
sym->prefix = 1;
+ if (strstarts(sym->name, ".klp.sym"))
+ sym->klp = 1;
- if (is_func_sym(sym) && strstr(sym->name, ".cold"))
+ if (!sym->klp && is_func_sym(sym) && strstr(sym->name, ".cold"))
sym->cold = 1;
sym->pfunc = sym->cfunc = sym;
diff --git a/tools/objtool/include/objtool/elf.h b/tools/objtool/include/objtool/elf.h
index 1bf9c0a1112d..adfe508f96f5 100644
--- a/tools/objtool/include/objtool/elf.h
+++ b/tools/objtool/include/objtool/elf.h
@@ -84,6 +84,7 @@ struct symbol {
u8 debug_checksum : 1;
u8 changed : 1;
u8 included : 1;
+ u8 klp : 1;
struct list_head pv_target;
struct reloc *relocs;
struct section *group_sec;
diff --git a/tools/objtool/include/objtool/objtool.h b/tools/objtool/include/objtool/objtool.h
index 37e9fe4492d6..731965a742e9 100644
--- a/tools/objtool/include/objtool/objtool.h
+++ b/tools/objtool/include/objtool/objtool.h
@@ -30,7 +30,7 @@ struct objtool_file {
struct list_head mcount_loc_list;
struct list_head endbr_list;
struct list_head call_list;
- bool ignore_unreachables, hints, rodata;
+ bool ignore_unreachables, hints, rodata, klp;
unsigned int nr_endbr;
unsigned int nr_endbr_int;
--
2.49.0
next prev parent reply other threads:[~2025-05-09 20:18 UTC|newest]
Thread overview: 134+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-09 20:16 [PATCH v2 00/62] objtool,livepatch: klp-build livepatch module generation Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 01/62] s390/vmlinux.lds.S: Prevent thunk functions from getting placed with normal text Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 02/62] vmlinux.lds: Unify TEXT_MAIN, DATA_MAIN, and related macros Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 03/62] x86/module: Improve relocation error messages Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 04/62] x86/kprobes: Remove STACK_FRAME_NON_STANDARD annotation Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 05/62] compiler: Tweak __UNIQUE_ID() naming Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 06/62] compiler.h: Make addressable symbols less of an eyesore Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 07/62] elfnote: Change ELFNOTE() to use __UNIQUE_ID() Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 08/62] kbuild: Remove 'kmod_' prefix from __KBUILD_MODNAME Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 09/62] modpost: Ignore unresolved section bounds symbols Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 10/62] x86/alternative: Refactor INT3 call emulation selftest Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 11/62] objtool: Make find_symbol_containing() less arbitrary Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 12/62] objtool: Speed up SHT_GROUP reindexing Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 13/62] objtool: Fix broken error handling in read_symbols() Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 14/62] objtool: Propagate elf_truncate_section() error in elf_write() Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 15/62] objtool: Add empty symbols to the symbol tree again Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 16/62] objtool: Fix interval tree insertion for zero-length symbols Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 17/62] objtool: Fix weak symbol detection Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 18/62] objtool: Fix x86 addend calculation Josh Poimboeuf
2025-05-26 10:23 ` Peter Zijlstra
2025-06-04 23:53 ` Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 19/62] objtool: Fix __pa_symbol() relocation handling Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 20/62] objtool: Fix "unexpected end of section" warning for alternatives Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 21/62] objtool: Check for missing annotation entries in read_annotate() Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 22/62] objtool: Const string cleanup Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 23/62] objtool: Clean up compiler flag usage Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 24/62] objtool: Remove .parainstructions reference Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 25/62] objtool: Convert elf iterator macros to use 'struct elf' Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 26/62] objtool: Add section/symbol type helpers Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 27/62] objtool: Mark .cold subfunctions Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 28/62] objtool: Fix weak symbol hole detection for .cold functions Josh Poimboeuf
2025-05-26 10:38 ` Peter Zijlstra
2025-06-04 23:56 ` Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 29/62] objtool: Mark prefix functions Josh Poimboeuf
2025-05-26 10:43 ` Peter Zijlstra
2025-06-05 0:04 ` Josh Poimboeuf
2025-06-26 22:43 ` Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 30/62] objtool: Simplify reloc offset calculation in unwind_read_hints() Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 31/62] objtool: Avoid emptying lists for duplicate sections Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 32/62] objtool: Suppress section skipping warnings with --dryrun Josh Poimboeuf
2025-05-26 10:52 ` Peter Zijlstra
2025-05-28 10:34 ` Peter Zijlstra
2025-06-05 0:19 ` Josh Poimboeuf
2025-06-05 7:32 ` Peter Zijlstra
2025-06-05 14:52 ` Peter Zijlstra
2025-06-05 16:18 ` Josh Poimboeuf
2025-06-05 0:14 ` Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 33/62] objtool: Rename --Werror to --werror Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 34/62] objtool: Reindent check_options[] Josh Poimboeuf
2025-05-09 20:16 ` [PATCH v2 35/62] objtool: Refactor add_jump_destinations() Josh Poimboeuf
2025-05-23 11:46 ` Joe Lawrence
2025-06-04 23:49 ` Josh Poimboeuf
2025-05-09 20:17 ` [PATCH v2 36/62] objtool: Simplify special symbol handling in elf_update_symbol() Josh Poimboeuf
2025-05-09 20:17 ` [PATCH v2 37/62] objtool: Generalize elf_create_symbol() Josh Poimboeuf
2025-05-09 20:17 ` [PATCH v2 38/62] objtool: Generalize elf_create_section() Josh Poimboeuf
2025-05-09 20:17 ` [PATCH v2 39/62] objtool: Add elf_create_data() Josh Poimboeuf
2025-05-09 20:17 ` [PATCH v2 40/62] objtool: Introduce elf_create_reloc() and elf_init_reloc() Josh Poimboeuf
2025-05-09 20:17 ` [PATCH v2 41/62] objtool: Add elf_create_file() Josh Poimboeuf
2025-05-09 20:17 ` [PATCH v2 42/62] kbuild,x86: Fix module permissions for __jump_table and __bug_table Josh Poimboeuf
2025-05-26 11:06 ` Peter Zijlstra
2025-06-05 0:22 ` Josh Poimboeuf
2025-06-05 4:00 ` Josh Poimboeuf
2025-05-09 20:17 ` [PATCH v2 43/62] x86/alternative: Define ELF section entry size for alternatives Josh Poimboeuf
2025-05-09 21:36 ` Borislav Petkov
2025-05-09 21:54 ` Josh Poimboeuf
2025-05-09 22:12 ` Borislav Petkov
2025-05-09 20:17 ` [PATCH v2 44/62] x86/jump_label: Define ELF section entry size for jump table Josh Poimboeuf
2025-05-09 20:17 ` [PATCH v2 45/62] x86/extable: Define ELF section entry size for exception tables Josh Poimboeuf
2025-05-28 14:40 ` Joe Lawrence
2025-06-05 22:14 ` Josh Poimboeuf
2025-06-06 3:58 ` Brian Gerst
2025-06-06 7:48 ` Josh Poimboeuf
2025-06-07 1:26 ` Brian Gerst
2025-06-09 17:07 ` Josh Poimboeuf
2025-05-09 20:17 ` [PATCH v2 46/62] x86/bug: Define ELF section entry size for the bug table Josh Poimboeuf
2025-05-09 20:17 ` [PATCH v2 47/62] x86/orc: Define ELF section entry size for unwind hints Josh Poimboeuf
2025-05-09 20:17 ` [PATCH v2 48/62] objtool: Make STACK_FRAME_NON_STANDARD consistent Josh Poimboeuf
2025-05-09 20:17 ` [PATCH v2 49/62] kbuild,objtool: Defer objtool validation step for CONFIG_LIVEPATCH Josh Poimboeuf
2025-05-28 14:45 ` Joe Lawrence
2025-06-06 0:37 ` Josh Poimboeuf
2025-05-09 20:17 ` [PATCH v2 50/62] objtool/klp: Add --checksum option to generate per-function checksums Josh Poimboeuf
2025-05-09 20:17 ` [PATCH v2 51/62] objtool/klp: Add --debug-checksum=<funcs> to show per-instruction checksums Josh Poimboeuf
2025-05-09 20:17 ` [PATCH v2 52/62] objtool/klp: Introduce klp diff subcommand for diffing object files Josh Poimboeuf
2025-05-13 14:49 ` laokz
2025-05-13 20:45 ` Josh Poimboeuf
2025-05-14 10:32 ` laokz
2025-05-26 18:22 ` Peter Zijlstra
2025-06-05 0:36 ` Josh Poimboeuf
2025-05-26 18:25 ` Peter Zijlstra
2025-05-26 18:27 ` Peter Zijlstra
2025-06-05 7:32 ` Josh Poimboeuf
2025-05-26 18:47 ` Peter Zijlstra
2025-06-05 20:12 ` Josh Poimboeuf
2025-05-26 18:50 ` Peter Zijlstra
2025-06-05 21:17 ` Josh Poimboeuf
2025-05-26 18:57 ` Peter Zijlstra
2025-06-05 22:07 ` Josh Poimboeuf
2025-06-09 18:32 ` Joe Lawrence
2025-06-09 23:21 ` Josh Poimboeuf
2025-06-10 12:39 ` Joe Lawrence
2025-06-10 20:26 ` Josh Poimboeuf
2025-05-09 20:17 ` [PATCH v2 53/62] objtool/klp: Add --debug option to show cloning decisions Josh Poimboeuf
2025-05-09 20:17 ` [PATCH v2 54/62] objtool/klp: Add post-link subcommand to finalize livepatch modules Josh Poimboeuf
2025-06-26 23:19 ` Josh Poimboeuf
2025-05-09 20:17 ` [PATCH v2 55/62] objtool: Disallow duplicate prefix symbols Josh Poimboeuf
2025-05-09 20:17 ` Josh Poimboeuf [this message]
2025-05-09 20:17 ` [PATCH v2 57/62] livepatch/klp-build: Introduce fix-patch-lines script to avoid __LINE__ diff noise Josh Poimboeuf
2025-05-09 20:17 ` [PATCH v2 58/62] livepatch/klp-build: Add stub init code for livepatch modules Josh Poimboeuf
2025-05-09 20:17 ` [PATCH v2 59/62] livepatch/klp-build: Introduce klp-build script for generating " Josh Poimboeuf
2025-06-06 13:05 ` Joe Lawrence
2025-06-06 19:03 ` Josh Poimboeuf
2025-06-06 20:28 ` Josh Poimboeuf
2025-06-06 20:53 ` Joe Lawrence
2025-06-06 20:58 ` Joe Lawrence
2025-06-06 21:35 ` Josh Poimboeuf
2025-06-09 21:20 ` Joe Lawrence
2025-06-09 23:59 ` Josh Poimboeuf
2025-06-10 2:05 ` Joe Lawrence
2025-06-10 2:14 ` Joe Lawrence
2025-06-10 15:41 ` Josh Poimboeuf
2025-06-10 2:34 ` Joe Lawrence
2025-06-10 16:10 ` Josh Poimboeuf
2025-06-11 18:44 ` Joe Lawrence
2025-06-11 19:08 ` Josh Poimboeuf
2025-06-11 19:21 ` Joe Lawrence
2025-06-11 21:44 ` Joe Lawrence
2025-06-11 23:12 ` Josh Poimboeuf
2025-06-12 18:25 ` Joe Lawrence
2025-06-18 22:38 ` Dylan Hatch
2025-06-26 23:27 ` Josh Poimboeuf
2025-05-09 20:17 ` [PATCH v2 60/62] livepatch/klp-build: Add --debug option to show cloning decisions Josh Poimboeuf
2025-05-09 20:17 ` [PATCH v2 61/62] livepatch/klp-build: Add --show-first-changed option to show function divergence Josh Poimboeuf
2025-05-09 20:17 ` [PATCH v2 62/62] livepatch: Introduce source code helpers for livepatch modules Josh Poimboeuf
2025-06-12 20:56 ` [PATCH v2 00/62] objtool,livepatch: klp-build livepatch module generation 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=ed05aca9028fa80d9f48ee88ebb80dc90c6a4194.1746821544.git.jpoimboe@kernel.org \
--to=jpoimboe@kernel.org \
--cc=a.mehrab@bytedance.com \
--cc=chenzhongjin@huawei.com \
--cc=jikos@kernel.org \
--cc=joe.lawrence@redhat.com \
--cc=laokz@foxmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=live-patching@vger.kernel.org \
--cc=mbenes@suse.cz \
--cc=mpdesouza@suse.com \
--cc=pmladek@suse.com \
--cc=puranjay@kernel.org \
--cc=song@kernel.org \
--cc=wnliu@google.com \
--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
all inboxes | Powered by JetHome®