kbuild: Hoist '--orphan-handling' into Kconfig
Currently, '--orphan-handling=warn' is spread out across four different architectures in their respective Makefiles, which makes it a little unruly to deal with in case it needs to be disabled for a specific linker version (in this case, ld.lld 10.0.1). To make it easier to control this, hoist this warning into Kconfig and the main Makefile so that disabling it is simpler, as the warning will only be enabled in a couple places (main Makefile and a couple of compressed boot folders that blow away LDFLAGS_vmlinx) and making it conditional is easier due to Kconfig syntax. One small additional benefit of this is saving a call to ld-option on incremental builds because we will have already evaluated it for CONFIG_LD_ORPHAN_WARN. To keep the list of supported architectures the same, introduce CONFIG_ARCH_WANT_LD_ORPHAN_WARN, which an architecture can select to gain this automatically after all of the sections are specified and size asserted. A special thanks to Kees Cook for the help text on this config. Link: https://github.com/ClangBuiltLinux/linux/issues/1187 Acked-by: Kees Cook <keescook@chromium.org> Acked-by: Michael Ellerman <mpe@ellerman.id.au> (powerpc) Reviewed-by: Nick Desaulniers <ndesaulniers@google.com> Tested-by: Nick Desaulniers <ndesaulniers@google.com> Signed-off-by: Nathan Chancellor <natechancellor@gmail.com> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
This commit is contained in:
parent
b8a9092330
commit
59612b24f7
6
Makefile
6
Makefile
|
@ -986,6 +986,12 @@ ifeq ($(CONFIG_RELR),y)
|
||||||
LDFLAGS_vmlinux += --pack-dyn-relocs=relr
|
LDFLAGS_vmlinux += --pack-dyn-relocs=relr
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# We never want expected sections to be placed heuristically by the
|
||||||
|
# linker. All sections should be explicitly named in the linker script.
|
||||||
|
ifdef CONFIG_LD_ORPHAN_WARN
|
||||||
|
LDFLAGS_vmlinux += --orphan-handling=warn
|
||||||
|
endif
|
||||||
|
|
||||||
# Align the bit size of userspace programs with the kernel
|
# Align the bit size of userspace programs with the kernel
|
||||||
KBUILD_USERCFLAGS += $(filter -m32 -m64 --target=%, $(KBUILD_CFLAGS))
|
KBUILD_USERCFLAGS += $(filter -m32 -m64 --target=%, $(KBUILD_CFLAGS))
|
||||||
KBUILD_USERLDFLAGS += $(filter -m32 -m64 --target=%, $(KBUILD_CFLAGS))
|
KBUILD_USERLDFLAGS += $(filter -m32 -m64 --target=%, $(KBUILD_CFLAGS))
|
||||||
|
|
|
@ -1028,6 +1028,15 @@ config HAVE_STATIC_CALL_INLINE
|
||||||
bool
|
bool
|
||||||
depends on HAVE_STATIC_CALL
|
depends on HAVE_STATIC_CALL
|
||||||
|
|
||||||
|
config ARCH_WANT_LD_ORPHAN_WARN
|
||||||
|
bool
|
||||||
|
help
|
||||||
|
An arch should select this symbol once all linker sections are explicitly
|
||||||
|
included, size-asserted, or discarded in the linker scripts. This is
|
||||||
|
important because we never want expected sections to be placed heuristically
|
||||||
|
by the linker, since the locations of such sections can change between linker
|
||||||
|
versions.
|
||||||
|
|
||||||
source "kernel/gcov/Kconfig"
|
source "kernel/gcov/Kconfig"
|
||||||
|
|
||||||
source "scripts/gcc-plugins/Kconfig"
|
source "scripts/gcc-plugins/Kconfig"
|
||||||
|
|
|
@ -35,6 +35,7 @@ config ARM
|
||||||
select ARCH_USE_CMPXCHG_LOCKREF
|
select ARCH_USE_CMPXCHG_LOCKREF
|
||||||
select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT if MMU
|
select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT if MMU
|
||||||
select ARCH_WANT_IPC_PARSE_VERSION
|
select ARCH_WANT_IPC_PARSE_VERSION
|
||||||
|
select ARCH_WANT_LD_ORPHAN_WARN
|
||||||
select BINFMT_FLAT_ARGVP_ENVP_ON_STACK
|
select BINFMT_FLAT_ARGVP_ENVP_ON_STACK
|
||||||
select BUILDTIME_TABLE_SORT if MMU
|
select BUILDTIME_TABLE_SORT if MMU
|
||||||
select CLONE_BACKWARDS
|
select CLONE_BACKWARDS
|
||||||
|
|
|
@ -16,10 +16,6 @@ LDFLAGS_vmlinux += --be8
|
||||||
KBUILD_LDFLAGS_MODULE += --be8
|
KBUILD_LDFLAGS_MODULE += --be8
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# We never want expected sections to be placed heuristically by the
|
|
||||||
# linker. All sections should be explicitly named in the linker script.
|
|
||||||
LDFLAGS_vmlinux += $(call ld-option, --orphan-handling=warn)
|
|
||||||
|
|
||||||
GZFLAGS :=-9
|
GZFLAGS :=-9
|
||||||
#KBUILD_CFLAGS +=-pipe
|
#KBUILD_CFLAGS +=-pipe
|
||||||
|
|
||||||
|
|
|
@ -129,7 +129,9 @@ LDFLAGS_vmlinux += --no-undefined
|
||||||
# Delete all temporary local symbols
|
# Delete all temporary local symbols
|
||||||
LDFLAGS_vmlinux += -X
|
LDFLAGS_vmlinux += -X
|
||||||
# Report orphan sections
|
# Report orphan sections
|
||||||
LDFLAGS_vmlinux += $(call ld-option, --orphan-handling=warn)
|
ifdef CONFIG_LD_ORPHAN_WARN
|
||||||
|
LDFLAGS_vmlinux += --orphan-handling=warn
|
||||||
|
endif
|
||||||
# Next argument is a linker script
|
# Next argument is a linker script
|
||||||
LDFLAGS_vmlinux += -T
|
LDFLAGS_vmlinux += -T
|
||||||
|
|
||||||
|
|
|
@ -81,6 +81,7 @@ config ARM64
|
||||||
select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT
|
select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT
|
||||||
select ARCH_WANT_FRAME_POINTERS
|
select ARCH_WANT_FRAME_POINTERS
|
||||||
select ARCH_WANT_HUGE_PMD_SHARE if ARM64_4K_PAGES || (ARM64_16K_PAGES && !ARM64_VA_BITS_36)
|
select ARCH_WANT_HUGE_PMD_SHARE if ARM64_4K_PAGES || (ARM64_16K_PAGES && !ARM64_VA_BITS_36)
|
||||||
|
select ARCH_WANT_LD_ORPHAN_WARN
|
||||||
select ARCH_HAS_UBSAN_SANITIZE_ALL
|
select ARCH_HAS_UBSAN_SANITIZE_ALL
|
||||||
select ARM_AMBA
|
select ARM_AMBA
|
||||||
select ARM_ARCH_TIMER
|
select ARM_ARCH_TIMER
|
||||||
|
|
|
@ -28,10 +28,6 @@ LDFLAGS_vmlinux += --fix-cortex-a53-843419
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# We never want expected sections to be placed heuristically by the
|
|
||||||
# linker. All sections should be explicitly named in the linker script.
|
|
||||||
LDFLAGS_vmlinux += $(call ld-option, --orphan-handling=warn)
|
|
||||||
|
|
||||||
ifeq ($(CONFIG_ARM64_USE_LSE_ATOMICS), y)
|
ifeq ($(CONFIG_ARM64_USE_LSE_ATOMICS), y)
|
||||||
ifneq ($(CONFIG_ARM64_LSE_ATOMICS), y)
|
ifneq ($(CONFIG_ARM64_LSE_ATOMICS), y)
|
||||||
$(warning LSE atomics not supported by binutils)
|
$(warning LSE atomics not supported by binutils)
|
||||||
|
|
|
@ -152,6 +152,7 @@ config PPC
|
||||||
select ARCH_USE_QUEUED_SPINLOCKS if PPC_QUEUED_SPINLOCKS
|
select ARCH_USE_QUEUED_SPINLOCKS if PPC_QUEUED_SPINLOCKS
|
||||||
select ARCH_WANT_IPC_PARSE_VERSION
|
select ARCH_WANT_IPC_PARSE_VERSION
|
||||||
select ARCH_WANT_IRQS_OFF_ACTIVATE_MM
|
select ARCH_WANT_IRQS_OFF_ACTIVATE_MM
|
||||||
|
select ARCH_WANT_LD_ORPHAN_WARN
|
||||||
select ARCH_WEAK_RELEASE_ACQUIRE
|
select ARCH_WEAK_RELEASE_ACQUIRE
|
||||||
select BINFMT_ELF
|
select BINFMT_ELF
|
||||||
select BUILDTIME_TABLE_SORT
|
select BUILDTIME_TABLE_SORT
|
||||||
|
|
|
@ -123,7 +123,6 @@ endif
|
||||||
LDFLAGS_vmlinux-y := -Bstatic
|
LDFLAGS_vmlinux-y := -Bstatic
|
||||||
LDFLAGS_vmlinux-$(CONFIG_RELOCATABLE) := -pie
|
LDFLAGS_vmlinux-$(CONFIG_RELOCATABLE) := -pie
|
||||||
LDFLAGS_vmlinux := $(LDFLAGS_vmlinux-y)
|
LDFLAGS_vmlinux := $(LDFLAGS_vmlinux-y)
|
||||||
LDFLAGS_vmlinux += $(call ld-option,--orphan-handling=warn)
|
|
||||||
|
|
||||||
ifdef CONFIG_PPC64
|
ifdef CONFIG_PPC64
|
||||||
ifeq ($(call cc-option-yn,-mcmodel=medium),y)
|
ifeq ($(call cc-option-yn,-mcmodel=medium),y)
|
||||||
|
|
|
@ -100,6 +100,7 @@ config X86
|
||||||
select ARCH_WANT_DEFAULT_BPF_JIT if X86_64
|
select ARCH_WANT_DEFAULT_BPF_JIT if X86_64
|
||||||
select ARCH_WANTS_DYNAMIC_TASK_STRUCT
|
select ARCH_WANTS_DYNAMIC_TASK_STRUCT
|
||||||
select ARCH_WANT_HUGE_PMD_SHARE
|
select ARCH_WANT_HUGE_PMD_SHARE
|
||||||
|
select ARCH_WANT_LD_ORPHAN_WARN
|
||||||
select ARCH_WANTS_THP_SWAP if X86_64
|
select ARCH_WANTS_THP_SWAP if X86_64
|
||||||
select BUILDTIME_TABLE_SORT
|
select BUILDTIME_TABLE_SORT
|
||||||
select CLKEVT_I8253
|
select CLKEVT_I8253
|
||||||
|
|
|
@ -209,9 +209,6 @@ ifdef CONFIG_X86_64
|
||||||
LDFLAGS_vmlinux += -z max-page-size=0x200000
|
LDFLAGS_vmlinux += -z max-page-size=0x200000
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# We never want expected sections to be placed heuristically by the
|
|
||||||
# linker. All sections should be explicitly named in the linker script.
|
|
||||||
LDFLAGS_vmlinux += $(call ld-option, --orphan-handling=warn)
|
|
||||||
|
|
||||||
archscripts: scripts_basic
|
archscripts: scripts_basic
|
||||||
$(Q)$(MAKE) $(build)=arch/x86/tools relocs
|
$(Q)$(MAKE) $(build)=arch/x86/tools relocs
|
||||||
|
|
|
@ -61,7 +61,9 @@ KBUILD_LDFLAGS += $(call ld-option,--no-ld-generated-unwind-info)
|
||||||
# Compressed kernel should be built as PIE since it may be loaded at any
|
# Compressed kernel should be built as PIE since it may be loaded at any
|
||||||
# address by the bootloader.
|
# address by the bootloader.
|
||||||
LDFLAGS_vmlinux := -pie $(call ld-option, --no-dynamic-linker)
|
LDFLAGS_vmlinux := -pie $(call ld-option, --no-dynamic-linker)
|
||||||
LDFLAGS_vmlinux += $(call ld-option, --orphan-handling=warn)
|
ifdef CONFIG_LD_ORPHAN_WARN
|
||||||
|
LDFLAGS_vmlinux += --orphan-handling=warn
|
||||||
|
endif
|
||||||
LDFLAGS_vmlinux += -T
|
LDFLAGS_vmlinux += -T
|
||||||
|
|
||||||
hostprogs := mkpiggy
|
hostprogs := mkpiggy
|
||||||
|
|
|
@ -1348,6 +1348,11 @@ config LD_DEAD_CODE_DATA_ELIMINATION
|
||||||
present. This option is not well tested yet, so use at your
|
present. This option is not well tested yet, so use at your
|
||||||
own risk.
|
own risk.
|
||||||
|
|
||||||
|
config LD_ORPHAN_WARN
|
||||||
|
def_bool y
|
||||||
|
depends on ARCH_WANT_LD_ORPHAN_WARN
|
||||||
|
depends on $(ld-option,--orphan-handling=warn)
|
||||||
|
|
||||||
config SYSCTL
|
config SYSCTL
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue