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 28/62] objtool: Fix weak symbol hole detection for .cold functions
Date: Fri, 9 May 2025 13:16:52 -0700 [thread overview]
Message-ID: <8ae052ab65412c0fc0359e780dc382f9feb53ace.1746821544.git.jpoimboe@kernel.org> (raw)
In-Reply-To: <cover.1746821544.git.jpoimboe@kernel.org>
When ignore_unreachable_insn() looks for weak function holes which jump
to their .cold functions, it assumes the parent function comes before
the corresponding .cold function in the symbol table. That's not
necessarily the case with -ffunction-sections.
Mark all the holes beforehand (including .cold functions) so the
ordering of the discovery doesn't matter.
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
---
tools/objtool/check.c | 84 ++++++++++++++-------------
tools/objtool/include/objtool/check.h | 3 +-
2 files changed, 45 insertions(+), 42 deletions(-)
diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index 043c36b70f26..a2a025ec57e8 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -2527,6 +2527,44 @@ static void mark_rodata(struct objtool_file *file)
file->rodata = found;
}
+static void mark_holes(struct objtool_file *file)
+{
+ struct instruction *insn;
+ bool in_hole = false;
+
+ if (!opts.link)
+ return;
+
+ /*
+ * Whole archive runs might encounter dead code from weak symbols.
+ * This is where the linker will have dropped the weak symbol in
+ * favour of a regular symbol, but leaves the code in place.
+ */
+ for_each_insn(file, insn) {
+ if (insn->sym || !find_symbol_hole_containing(insn->sec, insn->offset)) {
+ in_hole = false;
+ continue;
+ }
+
+ /* Skip function padding and pfx code */
+ if (!in_hole && insn->type == INSN_NOP)
+ continue;
+
+ in_hole = true;
+ insn->hole = 1;
+
+ /*
+ * If this hole jumps to a .cold function, mark it ignore.
+ */
+ if (insn->jump_dest) {
+ struct symbol *dest_func = insn_func(insn->jump_dest);
+
+ if (dest_func && dest_func->cold)
+ dest_func->ignore = true;
+ }
+ }
+}
+
static int decode_sections(struct objtool_file *file)
{
int ret;
@@ -2592,6 +2630,9 @@ static int decode_sections(struct objtool_file *file)
if (ret)
return ret;
+ /* Must be after add_jump_destinations() */
+ mark_holes(file);
+
/*
* Must be after add_call_destinations() such that it can override
* dead_end_function() marks.
@@ -4021,7 +4062,8 @@ static bool ignore_unreachable_insn(struct objtool_file *file, struct instructio
struct instruction *prev_insn;
int i;
- if (insn->type == INSN_NOP || insn->type == INSN_TRAP || (func && func->ignore))
+ if (insn->type == INSN_NOP || insn->type == INSN_TRAP ||
+ insn->hole || (func && func->ignore))
return true;
/*
@@ -4032,46 +4074,6 @@ static bool ignore_unreachable_insn(struct objtool_file *file, struct instructio
!strcmp(insn->sec->name, ".altinstr_aux"))
return true;
- /*
- * Whole archive runs might encounter dead code from weak symbols.
- * This is where the linker will have dropped the weak symbol in
- * favour of a regular symbol, but leaves the code in place.
- *
- * In this case we'll find a piece of code (whole function) that is not
- * covered by a !section symbol. Ignore them.
- */
- if (opts.link && !func) {
- int size = find_symbol_hole_containing(insn->sec, insn->offset);
- unsigned long end = insn->offset + size;
-
- if (!size) /* not a hole */
- return false;
-
- if (size < 0) /* hole until the end */
- return true;
-
- sec_for_each_insn_continue(file, insn) {
- /*
- * If we reach a visited instruction at or before the
- * end of the hole, ignore the unreachable.
- */
- if (insn->visited)
- return true;
-
- if (insn->offset >= end)
- break;
-
- /*
- * If this hole jumps to a .cold function, mark it ignore too.
- */
- if (insn->jump_dest && insn_func(insn->jump_dest) &&
- insn_func(insn->jump_dest)->cold)
- insn_func(insn->jump_dest)->ignore = true;
- }
-
- return false;
- }
-
if (!func)
return false;
diff --git a/tools/objtool/include/objtool/check.h b/tools/objtool/include/objtool/check.h
index 00fb745e7233..0f4e7ac929ef 100644
--- a/tools/objtool/include/objtool/check.h
+++ b/tools/objtool/include/objtool/check.h
@@ -64,7 +64,8 @@ struct instruction {
noendbr : 1,
unret : 1,
visited : 4,
- no_reloc : 1;
+ no_reloc : 1,
+ hole : 1;
/* 10 bit hole */
struct alt_group *alt_group;
--
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 ` Josh Poimboeuf [this message]
2025-05-26 10:38 ` [PATCH v2 28/62] objtool: Fix weak symbol hole detection for .cold functions 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 ` [PATCH v2 56/62] objtool: Add base objtool support for livepatch modules Josh Poimboeuf
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=8ae052ab65412c0fc0359e780dc382f9feb53ace.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®