mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH 00/13] Fail the build on objtool warnings
@ 2025-03-14 19:28 Josh Poimboeuf
  2025-03-14 19:28 ` [PATCH 01/13] x86/traps: Make exc_double_fault() consistently noreturn Josh Poimboeuf
                   ` (12 more replies)
  0 siblings, 13 replies; 69+ messages in thread
From: Josh Poimboeuf @ 2025-03-14 19:28 UTC (permalink / raw)
  To: x86; +Cc: linux-kernel, Peter Zijlstra, Brendan Jackman, Nathan Chancellor

Add an option to fail the build on objtool warnings, and enable it by
default except for CONFIG_COMPILE_TEST.

This is long overdue, probably the only reason we didn't do it before
(other than lack of time) was because there are still some obscure
warnings out there, especially once KCOV and sanitizers get added to the
mix.

But those are mostly bot issues, the main concern for objtool warnings
is actual real live kernels.  Hopefully the !COMPILE_TEST guard will
avoid too much wreckage for now.


Josh Poimboeuf (13):
  x86/traps: Make exc_double_fault() consistently noreturn
  objtool: Fix error handling inconsistencies in check()
  objtool: Improve __noreturn annotation warning
  objtool: Update documentation
  objtool: Increase per-function WARN_FUNC() rate limit
  objtool: Remove --unret dependency on --rethunk
  objtool: Consolidate option validation
  objtool: Upgrade "Linked object detected" warning to error
  objtool: Add --output option
  objtool: Add --Werror option
  objtool: Change "warning:" to "error:" for --Werror
  objtool: Create backup on error and print args
  objtool: Add CONFIG_OBJTOOL_WERROR

 arch/x86/kernel/traps.c                 |  18 +-
 lib/Kconfig.debug                       |  12 ++
 scripts/Makefile.lib                    |   1 +
 tools/objtool/Documentation/objtool.txt | 105 ++++++------
 tools/objtool/builtin-check.c           | 212 ++++++++++++++++++------
 tools/objtool/check.c                   |  60 +++----
 tools/objtool/elf.c                     |   3 -
 tools/objtool/include/objtool/builtin.h |   3 +-
 tools/objtool/include/objtool/elf.h     |   2 +-
 tools/objtool/include/objtool/warn.h    |  20 ++-
 tools/objtool/objtool.c                 |  78 +--------
 tools/objtool/orc_dump.c                |   7 +-
 12 files changed, 290 insertions(+), 231 deletions(-)

-- 
2.48.1


^ permalink raw reply	[flat|nested] 69+ messages in thread
* [PATCH v2 25/25] objtool: Update documentation
@ 2022-04-18 16:50 Josh Poimboeuf
  2022-04-22 10:34 ` [tip: objtool/core] " tip-bot2 for Josh Poimboeuf
  0 siblings, 1 reply; 69+ messages in thread
From: Josh Poimboeuf @ 2022-04-18 16:50 UTC (permalink / raw)
  To: x86; +Cc: Peter Zijlstra, linux-kernel, Miroslav Benes

The objtool documentation is very stack validation centric.  Broaden the
documentation and describe all the features objtool supports.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
---
 .../{stack-validation.txt => objtool.txt}     | 122 +++++++++++++++---
 1 file changed, 102 insertions(+), 20 deletions(-)
 rename tools/objtool/Documentation/{stack-validation.txt => objtool.txt} (80%)

diff --git a/tools/objtool/Documentation/stack-validation.txt b/tools/objtool/Documentation/objtool.txt
similarity index 80%
rename from tools/objtool/Documentation/stack-validation.txt
rename to tools/objtool/Documentation/objtool.txt
index 30f38fdc0d56..8a671902a187 100644
--- a/tools/objtool/Documentation/stack-validation.txt
+++ b/tools/objtool/Documentation/objtool.txt
@@ -1,15 +1,103 @@
-Compile-time stack metadata validation
-======================================
+Objtool
+=======
 
+The kernel CONFIG_OBJTOOL option enables a host tool named 'objtool'
+which runs at compile time.  It can do various validations and
+transformations on .o files.
 
-Overview
+Objtool has become an integral part of the x86-64 kernel toolchain.  The
+kernel depends on it for a variety of security and performance features
+(and other types of features as well).
+
+
+Features
 --------
 
-The kernel CONFIG_STACK_VALIDATION option enables a host tool named
-objtool which runs at compile time.  It has a "check" subcommand which
-analyzes every .o file and ensures the validity of its stack metadata.
-It enforces a set of rules on asm code and C inline assembly code so
-that stack traces can be reliable.
+Objtool has the following features:
+
+- Stack unwinding metadata validation -- useful for helping to ensure
+  stack traces are reliable for live patching
+
+- ORC unwinder metadata generation -- a faster and more precise
+  alternative to frame pointer based unwinding
+
+- Retpoline validation -- ensures that all indirect calls go through
+  retpoline thunks, for Spectre v2 mitigations
+
+- Retpoline call site annotation -- annotates all retpoline thunk call
+  sites, enabling the kernel to patch them inline, to prevent "thunk
+  funneling" for both security and performance reasons
+
+- Non-instrumentation validation -- validates non-instrumentable
+  ("noinstr") code rules, preventing instrumentation in low-level C
+  entry code
+
+- Static call annotation -- annotates static call sites, enabling the
+  kernel to implement inline static calls, a faster alternative to some
+  indirect branches
+
+- Uaccess validation -- validates uaccess rules for a proper
+  implementation of Supervisor Mode Access Protection (SMAP)
+
+- Straight Line Speculation validation -- validates certain SLS
+  mitigations
+
+- Indirect Branch Tracking validation -- validates Intel CET IBT rules
+  to ensure that all functions referenced by function pointers have
+  corresponding ENDBR instructions
+
+- Indirect Branch Tracking annotation -- annotates unused ENDBR
+  instruction sites, enabling the kernel to "seal" them (replace them
+  with NOPs) to further harden IBT
+
+- Function entry annotation -- annotates function entries, enabling
+  kernel function tracing
+
+- Other toolchain hacks which will go unmentioned at this time...
+
+Each feature can be enabled individually or in combination using the
+objtool cmdline.
+
+
+Objects
+-------
+
+Typically, objtool runs on every translation unit (TU, aka ".o file") in
+the kernel.  If a TU is part of a kernel module, the '--module' option
+is added.
+
+However:
+
+- If noinstr validation is enabled, it also runs on vmlinux.o, with all
+  options removed and '--noinstr' added.
+
+- If IBT or LTO is enabled, it doesn't run on TUs at all.  Instead it
+  runs on vmlinux.o and linked modules, with all options.
+
+In summary:
+
+  A) Legacy mode:
+             TU: objtool [--module] <options>
+        vmlinux: N/A
+         module: N/A
+
+  B) CONFIG_NOINSTR_VALIDATION=y && !(CONFIG_X86_KERNEL_IBT=y || CONFIG_LTO=y):
+             TU: objtool [--module] <options>	// no --noinstr
+        vmlinux: objtool --noinstr		// other options removed
+         module: N/A
+
+  C) CONFIG_X86_KERNEL_IBT=y || CONFIG_LTO=y:
+             TU: N/A
+        vmlinux: objtool --noinstr <options>
+         module: objtool --module --noinstr <options>
+
+
+Stack validation
+----------------
+
+Objtool's stack validation feature analyzes every .o file and ensures
+the validity of its stack metadata.  It enforces a set of rules on asm
+code and C inline assembly code so that stack traces can be reliable.
 
 For each function, it recursively follows all possible code paths and
 validates the correct frame pointer state at each instruction.
@@ -20,14 +108,6 @@ alternative execution paths to a given instruction (or set of
 instructions).  Similarly, it knows how to follow switch statements, for
 which gcc sometimes uses jump tables.
 
-(Objtool also has an 'orc generate' subcommand which generates debuginfo
-for the ORC unwinder.  See Documentation/x86/orc-unwinder.rst in the
-kernel tree for more details.)
-
-
-Why do we need stack metadata validation?
------------------------------------------
-
 Here are some of the benefits of validating stack metadata:
 
 a) More reliable stack traces for frame pointer enabled kernels
@@ -113,9 +193,6 @@ c) Higher live patching compatibility rate
    For more details, see the livepatch documentation in the Linux kernel
    source tree at Documentation/livepatch/livepatch.rst.
 
-Rules
------
-
 To achieve the validation, objtool enforces the following rules:
 
 1. Each callable function must be annotated as such with the ELF
@@ -177,7 +254,8 @@ Another possible cause for errors in C code is if the Makefile removes
 -fno-omit-frame-pointer or adds -fomit-frame-pointer to the gcc options.
 
 Here are some examples of common warnings reported by objtool, what
-they mean, and suggestions for how to fix them.
+they mean, and suggestions for how to fix them.  When in doubt, ping
+the objtool maintainers.
 
 
 1. file.o: warning: objtool: func()+0x128: call without frame pointer save/setup
@@ -358,3 +436,7 @@ ignore it:
     OBJECT_FILES_NON_STANDARD := y
 
   to the Makefile.
+
+NOTE: OBJECT_FILES_NON_STANDARD doesn't work for link time validation of
+vmlinux.o or a linked module.  So it should only be used for files which
+aren't linked into vmlinux or a module.
-- 
2.34.1


^ permalink raw reply	[flat|nested] 69+ messages in thread

end of thread, other threads:[~2025-03-23  7:50 UTC | newest]

Thread overview: 69+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-03-14 19:28 [PATCH 00/13] Fail the build on objtool warnings Josh Poimboeuf
2025-03-14 19:28 ` [PATCH 01/13] x86/traps: Make exc_double_fault() consistently noreturn Josh Poimboeuf
2025-03-17  8:26   ` Brendan Jackman
2025-03-17 10:46   ` [tip: objtool/core] " tip-bot2 for Josh Poimboeuf
2025-03-17 10:47   ` [PATCH 01/13] " Miroslav Benes
2025-03-14 19:29 ` [PATCH 02/13] objtool: Fix error handling inconsistencies in check() Josh Poimboeuf
2025-03-17  8:29   ` Brendan Jackman
2025-03-17 10:46   ` [tip: objtool/core] " tip-bot2 for Josh Poimboeuf
2025-03-17 10:47   ` [PATCH 02/13] " Miroslav Benes
2025-03-14 19:29 ` [PATCH 03/13] objtool: Improve __noreturn annotation warning Josh Poimboeuf
2025-03-17  8:31   ` Brendan Jackman
2025-03-17 10:36     ` Miroslav Benes
2025-03-17 10:46   ` [tip: objtool/core] " tip-bot2 for Josh Poimboeuf
2025-03-14 19:29 ` [PATCH 04/13] objtool: Update documentation Josh Poimboeuf
2025-03-17  8:47   ` Brendan Jackman
2025-03-17 10:46   ` [tip: objtool/core] " tip-bot2 for Josh Poimboeuf
2025-03-17 10:46   ` [PATCH 04/13] " Miroslav Benes
2025-03-14 19:29 ` [PATCH 05/13] objtool: Increase per-function WARN_FUNC() rate limit Josh Poimboeuf
2025-03-17  9:15   ` Brendan Jackman
2025-03-17 12:29     ` Miroslav Benes
2025-03-18 10:59       ` Brendan Jackman
2025-03-17 10:46   ` [tip: objtool/core] " tip-bot2 for Josh Poimboeuf
2025-03-14 19:29 ` [PATCH 06/13] objtool: Remove --unret dependency on --rethunk Josh Poimboeuf
2025-03-14 19:38   ` Peter Zijlstra
2025-03-14 19:52     ` Josh Poimboeuf
2025-03-14 19:58       ` Peter Zijlstra
2025-03-17 12:33       ` Miroslav Benes
2025-03-17 10:46   ` [tip: objtool/core] " tip-bot2 for Josh Poimboeuf
2025-03-14 19:29 ` [PATCH 07/13] objtool: Consolidate option validation Josh Poimboeuf
2025-03-17  9:19   ` Brendan Jackman
2025-03-17 10:46   ` [tip: objtool/core] " tip-bot2 for Josh Poimboeuf
2025-03-17 12:35   ` [PATCH 07/13] " Miroslav Benes
2025-03-14 19:29 ` [PATCH 08/13] objtool: Upgrade "Linked object detected" warning to error Josh Poimboeuf
2025-03-17  9:21   ` Brendan Jackman
2025-03-17 10:46   ` [tip: objtool/core] " tip-bot2 for Josh Poimboeuf
2025-03-17 12:38   ` [PATCH 08/13] " Miroslav Benes
2025-03-14 19:29 ` [PATCH 09/13] objtool: Add --output option Josh Poimboeuf
2025-03-17  9:40   ` Brendan Jackman
2025-03-17 10:46   ` [tip: objtool/core] " tip-bot2 for Josh Poimboeuf
2025-03-17 12:48   ` [PATCH 09/13] " Miroslav Benes
2025-03-14 19:29 ` [PATCH 10/13] objtool: Add --Werror option Josh Poimboeuf
2025-03-17 10:46   ` [tip: objtool/core] " tip-bot2 for Josh Poimboeuf
2025-03-17 12:53   ` [PATCH 10/13] " Miroslav Benes
2025-03-14 19:29 ` [PATCH 11/13] objtool: Change "warning:" to "error:" for --Werror Josh Poimboeuf
2025-03-17  9:42   ` Brendan Jackman
2025-03-17 10:46   ` [tip: objtool/core] " tip-bot2 for Josh Poimboeuf
2025-03-17 13:04   ` [PATCH 11/13] " Miroslav Benes
2025-03-14 19:29 ` [PATCH 12/13] objtool: Create backup on error and print args Josh Poimboeuf
2025-03-17  9:53   ` Brendan Jackman
2025-03-17 10:46   ` [tip: objtool/core] " tip-bot2 for Josh Poimboeuf
2025-03-17 14:09   ` [PATCH 12/13] " Miroslav Benes
2025-03-14 19:29 ` [PATCH 13/13] objtool: Add CONFIG_OBJTOOL_WERROR Josh Poimboeuf
2025-03-16  0:41   ` Ingo Molnar
2025-03-16  1:49     ` Josh Poimboeuf
2025-03-16 11:56       ` Ingo Molnar
2025-03-18  4:55         ` Josh Poimboeuf
2025-03-17 10:46   ` [tip: objtool/core] " tip-bot2 for Josh Poimboeuf
2025-03-17 11:07   ` tip-bot2 for Josh Poimboeuf
2025-03-17 21:27     ` Ingo Molnar
2025-03-18  0:05       ` Josh Poimboeuf
2025-03-20 17:10         ` Steven Rostedt
2025-03-18 11:51       ` Ingo Molnar
2025-03-18 14:26         ` Josh Poimboeuf
2025-03-20  8:51         ` Ingo Molnar
2025-03-18  0:27     ` Josh Poimboeuf
2025-03-18  4:59       ` Josh Poimboeuf
2025-03-17 14:14   ` [PATCH 13/13] " Miroslav Benes
2025-03-23  7:50     ` Josh Poimboeuf
  -- strict thread matches above, loose matches on Subject: below --
2022-04-18 16:50 [PATCH v2 25/25] objtool: Update documentation Josh Poimboeuf
2022-04-22 10:34 ` [tip: objtool/core] " tip-bot2 for Josh Poimboeuf

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®