kbuild: upgrade the orphan section warning to an error if CONFIG_WERROR is set

Andrew Cooper suggested upgrading the orphan section warning to a hard link
error. However Nathan Chancellor said outright turning the warning into an
error with no escape hatch might be too aggressive, as we have had these
warnings triggered by new compiler generated sections, and suggested turning
orphan sections into an error only if CONFIG_WERROR is set. Kees Cook echoed
and emphasized that the mandate from Linus is that we should avoid breaking
builds. It wrecks bisection, it causes problems across compiler versions, etc.

Thus upgrade the orphan section warning to a hard link error only if
CONFIG_WERROR is set.

Suggested-by: Andrew Cooper <andrew.cooper3@citrix.com>
Suggested-by: Nathan Chancellor <nathan@kernel.org>
Signed-off-by: Xin Li <xin3.li@intel.com>
Reviewed-by: Nathan Chancellor <nathan@kernel.org>
Tested-by: Nathan Chancellor <nathan@kernel.org>
Signed-off-by: Kees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/r/20221025073023.16137-2-xin3.li@intel.com
This commit is contained in:
Xin Li 2022-10-25 00:30:23 -07:00 committed by Kees Cook
parent 5a17f040fa
commit e1789d7c75
6 changed files with 17 additions and 8 deletions

View file

@ -1118,7 +1118,7 @@ endif
# We never want expected sections to be placed heuristically by the # We never want expected sections to be placed heuristically by the
# linker. All sections should be explicitly named in the linker script. # linker. All sections should be explicitly named in the linker script.
ifdef CONFIG_LD_ORPHAN_WARN ifdef CONFIG_LD_ORPHAN_WARN
LDFLAGS_vmlinux += --orphan-handling=warn LDFLAGS_vmlinux += --orphan-handling=$(CONFIG_LD_ORPHAN_WARN_LEVEL)
endif endif
# Align the bit size of userspace programs with the kernel # Align the bit size of userspace programs with the kernel

View file

@ -123,7 +123,7 @@ LDFLAGS_vmlinux += --no-undefined
LDFLAGS_vmlinux += -X LDFLAGS_vmlinux += -X
# Report orphan sections # Report orphan sections
ifdef CONFIG_LD_ORPHAN_WARN ifdef CONFIG_LD_ORPHAN_WARN
LDFLAGS_vmlinux += --orphan-handling=warn LDFLAGS_vmlinux += --orphan-handling=$(CONFIG_LD_ORPHAN_WARN_LEVEL)
endif endif
# Next argument is a linker script # Next argument is a linker script
LDFLAGS_vmlinux += -T LDFLAGS_vmlinux += -T

View file

@ -27,7 +27,7 @@ ldflags-y := -shared -soname=linux-vdso.so.1 --hash-style=sysv \
-Bsymbolic --build-id=sha1 -n $(btildflags-y) -Bsymbolic --build-id=sha1 -n $(btildflags-y)
ifdef CONFIG_LD_ORPHAN_WARN ifdef CONFIG_LD_ORPHAN_WARN
ldflags-y += --orphan-handling=warn ldflags-y += --orphan-handling=$(CONFIG_LD_ORPHAN_WARN_LEVEL)
endif endif
ldflags-y += -T ldflags-y += -T

View file

@ -104,7 +104,7 @@ VDSO_AFLAGS += -D__ASSEMBLY__
VDSO_LDFLAGS += -Bsymbolic --no-undefined -soname=linux-vdso.so.1 VDSO_LDFLAGS += -Bsymbolic --no-undefined -soname=linux-vdso.so.1
VDSO_LDFLAGS += -z max-page-size=4096 -z common-page-size=4096 VDSO_LDFLAGS += -z max-page-size=4096 -z common-page-size=4096
VDSO_LDFLAGS += -shared --hash-style=sysv --build-id=sha1 VDSO_LDFLAGS += -shared --hash-style=sysv --build-id=sha1
VDSO_LDFLAGS += --orphan-handling=warn VDSO_LDFLAGS += --orphan-handling=$(CONFIG_LD_ORPHAN_WARN_LEVEL)
# Borrow vdsomunge.c from the arm vDSO # Borrow vdsomunge.c from the arm vDSO

View file

@ -68,7 +68,7 @@ KBUILD_LDFLAGS += $(call ld-option,--no-ld-generated-unwind-info)
# 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)
ifdef CONFIG_LD_ORPHAN_WARN ifdef CONFIG_LD_ORPHAN_WARN
LDFLAGS_vmlinux += --orphan-handling=warn LDFLAGS_vmlinux += --orphan-handling=$(CONFIG_LD_ORPHAN_WARN_LEVEL)
endif endif
LDFLAGS_vmlinux += -z noexecstack LDFLAGS_vmlinux += -z noexecstack
ifeq ($(CONFIG_LD_IS_BFD),y) ifeq ($(CONFIG_LD_IS_BFD),y)

View file

@ -159,10 +159,12 @@ config WERROR
help help
A kernel build should not cause any compiler warnings, and this A kernel build should not cause any compiler warnings, and this
enables the '-Werror' (for C) and '-Dwarnings' (for Rust) flags enables the '-Werror' (for C) and '-Dwarnings' (for Rust) flags
to enforce that rule by default. to enforce that rule by default. Certain warnings from other tools
such as the linker may be upgraded to errors with this option as
well.
However, if you have a new (or very old) compiler with odd and However, if you have a new (or very old) compiler or linker with odd
unusual warnings, or you have some architecture with problems, and unusual warnings, or you have some architecture with problems,
you may need to disable this config option in order to you may need to disable this config option in order to
successfully build the kernel. successfully build the kernel.
@ -1454,6 +1456,13 @@ config LD_ORPHAN_WARN
def_bool y def_bool y
depends on ARCH_WANT_LD_ORPHAN_WARN depends on ARCH_WANT_LD_ORPHAN_WARN
depends on $(ld-option,--orphan-handling=warn) depends on $(ld-option,--orphan-handling=warn)
depends on $(ld-option,--orphan-handling=error)
config LD_ORPHAN_WARN_LEVEL
string
depends on LD_ORPHAN_WARN
default "error" if WERROR
default "warn"
config SYSCTL config SYSCTL
bool bool