Reposting this patch with a proper commit message following Greg's comment. No functional changes.
This patch integrates the Bootpatch-SLR prototype into the kernel build system. It introduces the CONFIG_SPSLR and CONFIG_SANEMAKER options, adds the linker script support required to retain and locate the metadata emitted by Pinpoint, and defines the linker symbols consumed by the Selfpatch runtime. The early x86 startup code and the vDSO are excluded from Pinpoint instrumentation. Startup code executes before Selfpatch has applied the runtime patches, while the vDSO is intentionally kept independent of the kernel image. Together these changes provide the build-time integration required for the compiler-generated metadata to reach the runtime patching infrastructure. Signed-off-by: York Jasper Niebuhr <[email protected]> --- arch/x86/boot/startup/Makefile | 4 ++++ arch/x86/entry/vdso/common/Makefile.include | 2 +- arch/x86/kernel/vmlinux.lds.S | 23 +++++++++++++++++++ init/Kconfig | 13 +++++++++++ scripts/module.lds.S | 25 +++++++++++++++++++++ 5 files changed, 66 insertions(+), 1 deletion(-) diff --git a/arch/x86/boot/startup/Makefile b/arch/x86/boot/startup/Makefile index 5e499cfb29b5..1fa601781546 100644 --- a/arch/x86/boot/startup/Makefile +++ b/arch/x86/boot/startup/Makefile @@ -12,6 +12,10 @@ KBUILD_CFLAGS += -D__DISABLE_EXPORTS -mcmodel=small -fPIC \ # disable ftrace hooks and LTO KBUILD_CFLAGS := $(subst $(CC_FLAGS_FTRACE),,$(KBUILD_CFLAGS)) KBUILD_CFLAGS := $(filter-out $(CC_FLAGS_LTO),$(KBUILD_CFLAGS)) + +# Startup code executes before Bootpatch-SLR applies its runtime patches. +KBUILD_CFLAGS := $(filter-out $(PINPOINT_PLUGIN_CFLAGS),$(KBUILD_CFLAGS)) + KASAN_SANITIZE := n KCSAN_SANITIZE := n KMSAN_SANITIZE := n diff --git a/arch/x86/entry/vdso/common/Makefile.include b/arch/x86/entry/vdso/common/Makefile.include index 687b3d89b40d..d8cc53cd9560 100644 --- a/arch/x86/entry/vdso/common/Makefile.include +++ b/arch/x86/entry/vdso/common/Makefile.include @@ -27,7 +27,7 @@ flags-remove-y += \ -mfentry -pg \ $(RANDSTRUCT_CFLAGS) $(GCC_PLUGINS_CFLAGS) $(KSTACK_ERASE_CFLAGS) \ $(RETPOLINE_CFLAGS) $(CC_FLAGS_LTO) $(CC_FLAGS_CFI) \ - $(PADDING_CFLAGS) + $(PADDING_CFLAGS) $(PINPOINT_PLUGIN_CFLAGS) # # Don't omit frame pointers for ease of userspace debugging, but do diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S index 74e336d7f9dd..aa71c2c2a756 100644 --- a/arch/x86/kernel/vmlinux.lds.S +++ b/arch/x86/kernel/vmlinux.lds.S @@ -200,6 +200,29 @@ SECTIONS /* rarely changed data like cpu maps */ READ_MOSTLY_DATA(INTERNODE_CACHE_BYTES) +#ifdef CONFIG_SPSLR + __spslr_start = .; + + . = ALIGN(8); + __start_spslr_units = .; + KEEP(*(spslr_units)) + __stop_spslr_units = .; + + . = ALIGN(8); + __start_spslr_targets = .; + KEEP(*(spslr_targets)) + __stop_spslr_targets = .; + + . = ALIGN(8); + KEEP(*(spslr_target_layouts)) + KEEP(*(spslr_cu_target_refs)) + KEEP(*(spslr_ipins)) + KEEP(*(spslr_dpins)) + KEEP(*(spslr_strtab)) + + __spslr_end = .; +#endif + /* End of data section */ _edata = .; } :data diff --git a/init/Kconfig b/init/Kconfig index 5230d4879b1c..2110aff8a5c8 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -2316,3 +2316,16 @@ config ARCH_HAS_SYNC_CORE_BEFORE_USERMODE # <asm/syscall_wrapper.h>. config ARCH_HAS_SYSCALL_WRAPPER def_bool n + +config SPSLR + bool "Selfpatch SLR prototype" + depends on X86_64 + depends on CC_IS_GCC + help + Experimental structure layout randomization prototype. + +config SANEMAKER + bool "Selfpatch SLR validation tooling" + depends on SPSLR + help + Experimental validation tooling for Selfpatch-SLR. diff --git a/scripts/module.lds.S b/scripts/module.lds.S index b62683061d79..e366be317115 100644 --- a/scripts/module.lds.S +++ b/scripts/module.lds.S @@ -62,6 +62,31 @@ SECTIONS { } MOD_SEPARATE_CODETAG_SECTIONS() + +#ifdef CONFIG_SPSLR + .spslr : ALIGN(8) { + __spslr_start = .; + + . = ALIGN(8); + __start_spslr_units = .; + KEEP(*(spslr_units)) + __stop_spslr_units = .; + + . = ALIGN(8); + __start_spslr_targets = .; + KEEP(*(spslr_targets)) + __stop_spslr_targets = .; + + . = ALIGN(8); + KEEP(*(spslr_target_layouts)) + KEEP(*(spslr_cu_target_refs)) + KEEP(*(spslr_ipins)) + KEEP(*(spslr_dpins)) + KEEP(*(spslr_strtab)) + + __spslr_end = .; + } +#endif } /* bring in arch-specific sections */ -- 2.43.0

