RE: [RFC PATCH v3 18/22] arm64: Build the kernel with ORC information

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,

I see the following build warning after this commit (gcc12):
  ld: warning: orphan section `.init.orc_unwind' from `arch/arm64/kernel/pi/kaslr_early.pi.o' being placed in section `.init.orc_unwind'
  ld: warning: orphan section `.init.orc_unwind_ip' from `arch/arm64/kernel/pi/kaslr_early.pi.o' being placed in section `.init.orc_unwind_ip'
  ...

My understanding of the cause is that arch/arm64/kernel/pi has its
own Makefile and adds "init" prefix to sections by objcopy:
 https://github.com/madvenka786/linux/blob/orc_v3/arch/arm64/kernel/pi/Makefile#L25

I assume these files are not relevant for livepatch perspective and so it is
safe to exclude these sections by --remove-section or should we care these as well?

Regards,
Tomohiro

> Subject: [RFC PATCH v3 18/22] arm64: Build the kernel with ORC information
> 
> From: "Madhavan T. Venkataraman" <madvenka@xxxxxxxxxxxxxxxxxxx>
> 
> Add code to scripts/Makefile.lib to define objtool options to generate
> ORC data for frame pointer validation.
> 
> Define kernel configs:
> 	- to enable dynamic FRAME_POINTER_VALIDATION
> 	- to enable the generation of ORC data using objtool
> 
> When these configs are enabled, objtool is invoked on relocatable files
> during kernel build with the following command:
> 
> 	objtool --stackval --orc <object-file>
> 
> Objtool creates special sections in the object files:
> 
> .orc_unwind_ip	PC array.
> .orc_unwind	ORC structure table.
> .orc_lookup	ORC lookup table.
> 
> Change arch/arm64/kernel/vmlinux.lds.S to include ORC_UNWIND_TABLE in
> the data section so that the special sections get included there. For
> modules, these sections will be added to the kernel during module load.
> 
> In the future, the kernel can use these sections to find the ORC for a
> given instruction address. The unwinder can then compute the FP at an
> instruction address and validate the actual FP with that.
> 
> Signed-off-by: Madhavan T. Venkataraman <madvenka@xxxxxxxxxxxxxxxxxxx>
> ---
>  arch/arm64/Kconfig              |  2 ++
>  arch/arm64/Kconfig.debug        | 32
> ++++++++++++++++++++++++++++++++
>  arch/arm64/include/asm/module.h | 12 +++++++++++-
>  arch/arm64/kernel/vmlinux.lds.S |  3 +++
>  include/linux/objtool.h         |  2 ++
>  scripts/Makefile                |  4 +++-
>  scripts/Makefile.lib            |  9 +++++++++
>  tools/include/linux/objtool.h   |  2 ++
>  8 files changed, 64 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> index 505c8a1ccbe0..73c3f30a37c7 100644
> --- a/arch/arm64/Kconfig
> +++ b/arch/arm64/Kconfig
> @@ -230,6 +230,8 @@ config ARM64
>  	select TRACE_IRQFLAGS_SUPPORT
>  	select TRACE_IRQFLAGS_NMI_SUPPORT
>  	select HAVE_SOFTIRQ_ON_OWN_STACK
> +	select HAVE_STACK_VALIDATION	if
> FRAME_POINTER_VALIDATION
> +	select STACK_VALIDATION		if HAVE_STACK_VALIDATION
>  	help
>  	  ARM 64-bit (AArch64) Linux support.
> 
> diff --git a/arch/arm64/Kconfig.debug b/arch/arm64/Kconfig.debug
> index 265c4461031f..a50caabdb18e 100644
> --- a/arch/arm64/Kconfig.debug
> +++ b/arch/arm64/Kconfig.debug
> @@ -20,4 +20,36 @@ config ARM64_RELOC_TEST
>  	depends on m
>  	tristate "Relocation testing module"
> 
> +config UNWINDER_ORC
> +	bool "ORC unwinder"
> +	depends on FRAME_POINTER_VALIDATION
> +	select HAVE_MOD_ARCH_SPECIFIC
> +	select OBJTOOL
> +	help
> +	  This option enables ORC (Oops Rewind Capability) for ARM64. This
> +	  allows the unwinder to look up ORC data for an instruction address
> +	  and compute the frame pointer at that address. The computed frame
> +	  pointer is used to validate the actual frame pointer.
> +
> +config UNWINDER_FRAME_POINTER
> +	bool "Frame pointer unwinder"
> +	depends on FRAME_POINTER_VALIDATION
> +	select FRAME_POINTER
> +	help
> +	  ARM64 already uses the frame pointer for unwinding kernel stack
> +	  traces. We need to enable this config to enable STACK_VALIDATION.
> +	  STACK_VALIDATION is needed to get objtool to do static analysis
> +	  of kernel code.
> +
> +config FRAME_POINTER_VALIDATION
> +	bool "Dynamic Frame pointer validation"
> +	select UNWINDER_FRAME_POINTER
> +	select UNWINDER_ORC
> +	help
> +		This invokes objtool on every object file causing it to
> +		generate ORC data for the object file. ORC data is in a custom
> +		data format which is a simplified version of the DWARF
> +		Call Frame Information standard. See UNWINDER_ORC for more
> +		details.
> +
>  source "drivers/hwtracing/coresight/Kconfig"
> diff --git a/arch/arm64/include/asm/module.h
> b/arch/arm64/include/asm/module.h
> index 18734fed3bdd..4362f44aae61 100644
> --- a/arch/arm64/include/asm/module.h
> +++ b/arch/arm64/include/asm/module.h
> @@ -6,6 +6,7 @@
>  #define __ASM_MODULE_H
> 
>  #include <asm-generic/module.h>
> +#include <asm/orc_types.h>
> 
>  #ifdef CONFIG_ARM64_MODULE_PLTS
>  struct mod_plt_sec {
> @@ -13,15 +14,24 @@ struct mod_plt_sec {
>  	int			plt_num_entries;
>  	int			plt_max_entries;
>  };
> +#endif
> 
> +#ifdef CONFIG_HAVE_MOD_ARCH_SPECIFIC
>  struct mod_arch_specific {
> +#ifdef CONFIG_ARM64_MODULE_PLTS
>  	struct mod_plt_sec	core;
>  	struct mod_plt_sec	init;
> 
>  	/* for CONFIG_DYNAMIC_FTRACE */
>  	struct plt_entry	*ftrace_trampolines;
> -};
>  #endif
> +#ifdef CONFIG_UNWINDER_ORC
> +	unsigned int num_orcs;
> +	int *orc_unwind_ip;
> +	struct orc_entry *orc_unwind;
> +#endif
> +};
> +#endif /* CONFIG_HAVE_MOD_ARCH_SPECIFIC */
> 
>  u64 module_emit_plt_entry(struct module *mod, Elf64_Shdr *sechdrs,
>  			  void *loc, const Elf64_Rela *rela,
> diff --git a/arch/arm64/kernel/vmlinux.lds.S
> b/arch/arm64/kernel/vmlinux.lds.S
> index 45131e354e27..bf7b55ae10ee 100644
> --- a/arch/arm64/kernel/vmlinux.lds.S
> +++ b/arch/arm64/kernel/vmlinux.lds.S
> @@ -61,6 +61,7 @@
>  #define RUNTIME_DISCARD_EXIT
> 
>  #include <asm-generic/vmlinux.lds.h>
> +#include <asm-generic/orc_lookup.h>
>  #include <asm/cache.h>
>  #include <asm/kernel-pgtable.h>
>  #include <asm/kexec.h>
> @@ -294,6 +295,8 @@ SECTIONS
>  		__mmuoff_data_end = .;
>  	}
> 
> +	ORC_UNWIND_TABLE
> +
>  	PECOFF_EDATA_PADDING
>  	__pecoff_data_rawsize = ABSOLUTE(. - __initdata_begin);
>  	_edata = .;
> diff --git a/include/linux/objtool.h b/include/linux/objtool.h
> index dcbd365944f6..c980522190f7 100644
> --- a/include/linux/objtool.h
> +++ b/include/linux/objtool.h
> @@ -31,7 +31,9 @@
> 
>  #ifdef CONFIG_OBJTOOL
> 
> +#ifndef CONFIG_ARM64
>  #include <asm/asm.h>
> +#endif
> 
>  #ifndef __ASSEMBLY__
> 
> diff --git a/scripts/Makefile b/scripts/Makefile
> index 1575af84d557..df3e4d90f195 100644
> --- a/scripts/Makefile
> +++ b/scripts/Makefile
> @@ -23,8 +23,10 @@ HOSTLDLIBS_sign-file = $(shell $(HOSTPKG_CONFIG)
> --libs libcrypto 2> /dev/null |
>  ifdef CONFIG_UNWINDER_ORC
>  ifeq ($(ARCH),x86_64)
>  ARCH := x86
> -endif
>  HOSTCFLAGS_sorttable.o += -I$(srctree)/tools/arch/x86/include
> +else
> +HOSTCFLAGS_sorttable.o += -I$(srctree)/tools/arch/$(ARCH)/include
> +endif
>  HOSTCFLAGS_sorttable.o += -DUNWINDER_ORC_ENABLED
>  endif
> 
> diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
> index 3aa384cec76b..d364871a1046 100644
> --- a/scripts/Makefile.lib
> +++ b/scripts/Makefile.lib
> @@ -252,6 +252,13 @@ ifdef CONFIG_OBJTOOL
> 
>  objtool := $(objtree)/tools/objtool/objtool
> 
> +ifdef CONFIG_FRAME_POINTER_VALIDATION
> +
> +objtool-args-$(CONFIG_STACK_VALIDATION)			+=
> --stackval
> +objtool-args-$(CONFIG_UNWINDER_ORC)			+= --orc
> +
> +else
> +
>  objtool-args-$(CONFIG_HAVE_JUMP_LABEL_HACK)		+=
> --hacks=jump_label
>  objtool-args-$(CONFIG_HAVE_NOINSTR_HACK)		+= --hacks=noinstr
>  objtool-args-$(CONFIG_X86_KERNEL_IBT)			+= --ibt
> @@ -265,6 +272,8 @@ objtool-args-$(CONFIG_HAVE_STATIC_CALL_INLINE)
> 		+= --static-call
>  objtool-args-$(CONFIG_HAVE_UACCESS_VALIDATION)		+=
> --uaccess
>  objtool-args-$(CONFIG_GCOV_KERNEL)			+=
> --no-unreachable
> 
> +endif
> +
>  objtool-args = $(objtool-args-y)					\
>  	$(if $(delay-objtool), --link)					\
>  	$(if $(part-of-module), --module)
> diff --git a/tools/include/linux/objtool.h b/tools/include/linux/objtool.h
> index dcbd365944f6..c980522190f7 100644
> --- a/tools/include/linux/objtool.h
> +++ b/tools/include/linux/objtool.h
> @@ -31,7 +31,9 @@
> 
>  #ifdef CONFIG_OBJTOOL
> 
> +#ifndef CONFIG_ARM64
>  #include <asm/asm.h>
> +#endif
> 
>  #ifndef __ASSEMBLY__
> 
> --
> 2.25.1
> 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@xxxxxxxxxxxxxxxxxxx
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux Kernel]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux