mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/
synced 2025-04-19 20:58:31 +09:00
kbuild: Introduce Kconfig symbol for linking vmlinux with relocations
Some architectures build vmlinux with static relocations preserved, but strip them again from the final vmlinux image. Arch specific tools consume these static relocations in order to construct relocation tables for KASLR. The fact that vmlinux is created, consumed and subsequently updated goes against the typical, declarative paradigm used by Make, which is based on rules and dependencies. So as a first step towards cleaning this up, introduce a Kconfig symbol to declare that the arch wants to consume the static relocations emitted into vmlinux. This will be wired up further in subsequent patches. Signed-off-by: Ard Biesheuvel <ardb@kernel.org> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
This commit is contained in:
parent
e22bbb8e97
commit
9b400d1725
4
Makefile
4
Makefile
@ -1120,6 +1120,10 @@ ifdef CONFIG_LD_ORPHAN_WARN
|
||||
LDFLAGS_vmlinux += --orphan-handling=$(CONFIG_LD_ORPHAN_WARN_LEVEL)
|
||||
endif
|
||||
|
||||
ifneq ($(CONFIG_ARCH_VMLINUX_NEEDS_RELOCS),)
|
||||
LDFLAGS_vmlinux += --emit-relocs --discard-none
|
||||
endif
|
||||
|
||||
# Align the bit size of userspace programs with the kernel
|
||||
KBUILD_USERCFLAGS += $(filter -m32 -m64 --target=%, $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS))
|
||||
KBUILD_USERLDFLAGS += $(filter -m32 -m64 --target=%, $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS))
|
||||
|
@ -1695,6 +1695,13 @@ config ARCH_HAS_KERNEL_FPU_SUPPORT
|
||||
Architectures that select this option can run floating-point code in
|
||||
the kernel, as described in Documentation/core-api/floating-point.rst.
|
||||
|
||||
config ARCH_VMLINUX_NEEDS_RELOCS
|
||||
bool
|
||||
help
|
||||
Whether the architecture needs vmlinux to be built with static
|
||||
relocations preserved. This is used by some architectures to
|
||||
construct bespoke relocation tables for KASLR.
|
||||
|
||||
source "kernel/gcov/Kconfig"
|
||||
|
||||
source "scripts/gcc-plugins/Kconfig"
|
||||
|
@ -2617,6 +2617,7 @@ config RELOCATABLE
|
||||
CPU_MIPS32_R6 || CPU_MIPS64_R6 || \
|
||||
CPU_P5600 || CAVIUM_OCTEON_SOC || \
|
||||
CPU_LOONGSON64
|
||||
select ARCH_VMLINUX_NEEDS_RELOCS
|
||||
help
|
||||
This builds a kernel image that retains relocation information
|
||||
so it can be loaded someplace besides the default 1MB.
|
||||
|
@ -100,10 +100,6 @@ LDFLAGS_vmlinux += -G 0 -static -n -nostdlib
|
||||
KBUILD_AFLAGS_MODULE += -mlong-calls
|
||||
KBUILD_CFLAGS_MODULE += -mlong-calls
|
||||
|
||||
ifeq ($(CONFIG_RELOCATABLE),y)
|
||||
LDFLAGS_vmlinux += --emit-relocs
|
||||
endif
|
||||
|
||||
cflags-y += -ffreestanding
|
||||
|
||||
cflags-$(CONFIG_CPU_BIG_ENDIAN) += -EB
|
||||
|
@ -1077,6 +1077,7 @@ config RELOCATABLE
|
||||
bool "Build a relocatable kernel"
|
||||
depends on MMU && 64BIT && !XIP_KERNEL
|
||||
select MODULE_SECTIONS if MODULES
|
||||
select ARCH_VMLINUX_NEEDS_RELOCS
|
||||
help
|
||||
This builds a kernel as a Position Independent Executable (PIE),
|
||||
which retains all relocation metadata required to relocate the
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
LDFLAGS_vmlinux := -z norelro
|
||||
ifeq ($(CONFIG_RELOCATABLE),y)
|
||||
LDFLAGS_vmlinux += -shared -Bsymbolic -z notext --emit-relocs
|
||||
LDFLAGS_vmlinux += -shared -Bsymbolic -z notext
|
||||
KBUILD_CFLAGS += -fPIE
|
||||
endif
|
||||
ifeq ($(CONFIG_DYNAMIC_FTRACE),y)
|
||||
|
@ -630,6 +630,7 @@ endchoice
|
||||
|
||||
config RELOCATABLE
|
||||
def_bool y
|
||||
select ARCH_VMLINUX_NEEDS_RELOCS
|
||||
help
|
||||
This builds a kernel image that retains relocation information
|
||||
so it can be loaded at an arbitrary address.
|
||||
|
@ -15,7 +15,7 @@ KBUILD_CFLAGS_MODULE += -fPIC
|
||||
KBUILD_AFLAGS += -m64
|
||||
KBUILD_CFLAGS += -m64
|
||||
KBUILD_CFLAGS += -fPIC
|
||||
LDFLAGS_vmlinux := -no-pie --emit-relocs --discard-none
|
||||
LDFLAGS_vmlinux := -no-pie
|
||||
extra_tools := relocs
|
||||
aflags_dwarf := -Wa,-gdwarf-2
|
||||
KBUILD_AFLAGS_DECOMPRESSOR := $(CLANG_FLAGS) -m64 -D__ASSEMBLY__
|
||||
|
@ -2200,6 +2200,7 @@ config RANDOMIZE_BASE
|
||||
config X86_NEED_RELOCS
|
||||
def_bool y
|
||||
depends on RANDOMIZE_BASE || (X86_32 && RELOCATABLE)
|
||||
select ARCH_VMLINUX_NEEDS_RELOCS
|
||||
|
||||
config PHYSICAL_ALIGN
|
||||
hex "Alignment value to which kernel should be aligned"
|
||||
|
@ -251,12 +251,6 @@ endif
|
||||
|
||||
KBUILD_LDFLAGS += -m elf_$(UTS_MACHINE)
|
||||
|
||||
ifdef CONFIG_X86_NEED_RELOCS
|
||||
LDFLAGS_vmlinux := --emit-relocs --discard-none
|
||||
else
|
||||
LDFLAGS_vmlinux :=
|
||||
endif
|
||||
|
||||
#
|
||||
# The 64-bit kernel must be aligned to 2MB. Pass -z max-page-size=0x200000 to
|
||||
# the linker to force 2MB page size regardless of the default page size used
|
||||
|
Loading…
x
Reference in New Issue
Block a user