2017-11-24 22:00:38 +08:00
|
|
|
# SPDX-License-Identifier: GPL-2.0
|
2005-04-17 06:20:36 +08:00
|
|
|
#
|
|
|
|
# s390/Makefile
|
|
|
|
#
|
|
|
|
# This file is included by the global makefile so that you can add your own
|
2021-10-13 14:36:22 +08:00
|
|
|
# architecture-specific flags and dependencies.
|
2005-04-17 06:20:36 +08:00
|
|
|
#
|
|
|
|
# Copyright (C) 1994 by Linus Torvalds
|
|
|
|
#
|
|
|
|
|
2010-02-27 05:37:53 +08:00
|
|
|
LD_BFD := elf64-s390
|
2018-08-24 07:20:39 +08:00
|
|
|
KBUILD_LDFLAGS := -m elf64_s390
|
2013-01-11 22:26:01 +08:00
|
|
|
KBUILD_AFLAGS_MODULE += -fPIC
|
|
|
|
KBUILD_CFLAGS_MODULE += -fPIC
|
2007-10-16 03:59:31 +08:00
|
|
|
KBUILD_AFLAGS += -m64
|
2018-06-15 18:28:05 +08:00
|
|
|
KBUILD_CFLAGS += -m64
|
s390: compile relocatable kernel without -fPIE
On s390, currently kernel uses the '-fPIE' compiler flag for compiling
vmlinux. This has a few problems:
- It uses dynamic symbols (.dynsym), for which the linker refuses to
allow more than 64k sections. This can break features which use
'-ffunction-sections' and '-fdata-sections', including kpatch-build
[1] and Function Granular KASLR.
- It unnecessarily uses GOT relocations, adding an extra layer of
indirection for many memory accesses.
Instead of using '-fPIE', resolve all the relocations at link time and
then manually adjust any absolute relocations (R_390_64) during boot.
This is done by first telling the linker to preserve all relocations
during the vmlinux link. (Note this is harmless: they are later
stripped in the vmlinux.bin link.)
Then use the 'relocs' tool to find all absolute relocations (R_390_64)
which apply to allocatable sections. The offsets of those relocations
are saved in a special section which is then used to adjust the
relocations during boot.
(Note: For some reason, Clang occasionally creates a GOT reference, even
without '-fPIE'. So Clang-compiled kernels have a GOT, which needs to
be adjusted.)
On my mostly-defconfig kernel, this reduces kernel text size by ~1.3%.
[1] https://github.com/dynup/kpatch/issues/1284
[2] https://gcc.gnu.org/pipermail/gcc-patches/2023-June/622872.html
[3] https://gcc.gnu.org/pipermail/gcc-patches/2023-August/625986.html
Compiler consideration:
Gcc recently implemented an optimization [2] for loading symbols without
explicit alignment, aligning with the IBM Z ELF ABI. This ABI mandates
symbols to reside on a 2-byte boundary, enabling the use of the larl
instruction. However, kernel linker scripts may still generate unaligned
symbols. To address this, a new -munaligned-symbols option has been
introduced [3] in recent gcc versions. This option has to be used with
future gcc versions.
Older Clang lacks support for handling unaligned symbols generated
by kernel linker scripts when the kernel is built without -fPIE. However,
future versions of Clang will include support for the -munaligned-symbols
option. When the support is unavailable, compile the kernel with -fPIE
to maintain the existing behavior.
In addition to it:
move vmlinux.relocs to safe relocation
When the kernel is built with CONFIG_KERNEL_UNCOMPRESSED, the entire
uncompressed vmlinux.bin is positioned in the bzImage decompressor
image at the default kernel LMA of 0x100000, enabling it to be executed
in-place. However, the size of .vmlinux.relocs could be large enough to
cause an overlap with the uncompressed kernel at the address 0x100000.
To address this issue, .vmlinux.relocs is positioned after the
.rodata.compressed in the bzImage. Nevertheless, in this configuration,
vmlinux.relocs will overlap with the .bss section of vmlinux.bin. To
overcome that, move vmlinux.relocs to a safe location before clearing
.bss and handling relocs.
Compile warning fix from Sumanth Korikkar:
When kernel is built with CONFIG_LD_ORPHAN_WARN and -fno-PIE, there are
several warnings:
ld: warning: orphan section `.rela.iplt' from
`arch/s390/kernel/head64.o' being placed in section `.rela.dyn'
ld: warning: orphan section `.rela.head.text' from
`arch/s390/kernel/head64.o' being placed in section `.rela.dyn'
ld: warning: orphan section `.rela.init.text' from
`arch/s390/kernel/head64.o' being placed in section `.rela.dyn'
ld: warning: orphan section `.rela.rodata.cst8' from
`arch/s390/kernel/head64.o' being placed in section `.rela.dyn'
Orphan sections are sections that exist in an object file but don't have
a corresponding output section in the final executable. ld raises a
warning when it identifies such sections.
Eliminate the warning by placing all .rela orphan sections in .rela.dyn
and raise an error when size of .rela.dyn is greater than zero. i.e.
Dont just neglect orphan sections.
This is similar to adjustment performed in x86, where kernel is built
with -fno-PIE.
commit 5354e84598f2 ("x86/build: Add asserts for unwanted sections")
[sumanthk@linux.ibm.com: rebased Josh Poimboeuf patches and move
vmlinux.relocs to safe location]
[hca@linux.ibm.com: merged compile warning fix from Sumanth]
Tested-by: Sumanth Korikkar <sumanthk@linux.ibm.com>
Acked-by: Vasily Gorbik <gor@linux.ibm.com>
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: Sumanth Korikkar <sumanthk@linux.ibm.com>
Link: https://lore.kernel.org/r/20240219132734.22881-4-sumanthk@linux.ibm.com
Link: https://lore.kernel.org/r/20240219132734.22881-5-sumanthk@linux.ibm.com
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
2024-02-19 21:27:33 +08:00
|
|
|
ifdef CONFIG_PIE_BUILD
|
2019-02-04 04:35:45 +08:00
|
|
|
KBUILD_CFLAGS += -fPIE
|
2024-02-08 08:15:03 +08:00
|
|
|
LDFLAGS_vmlinux := -pie -z notext
|
s390: compile relocatable kernel without -fPIE
On s390, currently kernel uses the '-fPIE' compiler flag for compiling
vmlinux. This has a few problems:
- It uses dynamic symbols (.dynsym), for which the linker refuses to
allow more than 64k sections. This can break features which use
'-ffunction-sections' and '-fdata-sections', including kpatch-build
[1] and Function Granular KASLR.
- It unnecessarily uses GOT relocations, adding an extra layer of
indirection for many memory accesses.
Instead of using '-fPIE', resolve all the relocations at link time and
then manually adjust any absolute relocations (R_390_64) during boot.
This is done by first telling the linker to preserve all relocations
during the vmlinux link. (Note this is harmless: they are later
stripped in the vmlinux.bin link.)
Then use the 'relocs' tool to find all absolute relocations (R_390_64)
which apply to allocatable sections. The offsets of those relocations
are saved in a special section which is then used to adjust the
relocations during boot.
(Note: For some reason, Clang occasionally creates a GOT reference, even
without '-fPIE'. So Clang-compiled kernels have a GOT, which needs to
be adjusted.)
On my mostly-defconfig kernel, this reduces kernel text size by ~1.3%.
[1] https://github.com/dynup/kpatch/issues/1284
[2] https://gcc.gnu.org/pipermail/gcc-patches/2023-June/622872.html
[3] https://gcc.gnu.org/pipermail/gcc-patches/2023-August/625986.html
Compiler consideration:
Gcc recently implemented an optimization [2] for loading symbols without
explicit alignment, aligning with the IBM Z ELF ABI. This ABI mandates
symbols to reside on a 2-byte boundary, enabling the use of the larl
instruction. However, kernel linker scripts may still generate unaligned
symbols. To address this, a new -munaligned-symbols option has been
introduced [3] in recent gcc versions. This option has to be used with
future gcc versions.
Older Clang lacks support for handling unaligned symbols generated
by kernel linker scripts when the kernel is built without -fPIE. However,
future versions of Clang will include support for the -munaligned-symbols
option. When the support is unavailable, compile the kernel with -fPIE
to maintain the existing behavior.
In addition to it:
move vmlinux.relocs to safe relocation
When the kernel is built with CONFIG_KERNEL_UNCOMPRESSED, the entire
uncompressed vmlinux.bin is positioned in the bzImage decompressor
image at the default kernel LMA of 0x100000, enabling it to be executed
in-place. However, the size of .vmlinux.relocs could be large enough to
cause an overlap with the uncompressed kernel at the address 0x100000.
To address this issue, .vmlinux.relocs is positioned after the
.rodata.compressed in the bzImage. Nevertheless, in this configuration,
vmlinux.relocs will overlap with the .bss section of vmlinux.bin. To
overcome that, move vmlinux.relocs to a safe location before clearing
.bss and handling relocs.
Compile warning fix from Sumanth Korikkar:
When kernel is built with CONFIG_LD_ORPHAN_WARN and -fno-PIE, there are
several warnings:
ld: warning: orphan section `.rela.iplt' from
`arch/s390/kernel/head64.o' being placed in section `.rela.dyn'
ld: warning: orphan section `.rela.head.text' from
`arch/s390/kernel/head64.o' being placed in section `.rela.dyn'
ld: warning: orphan section `.rela.init.text' from
`arch/s390/kernel/head64.o' being placed in section `.rela.dyn'
ld: warning: orphan section `.rela.rodata.cst8' from
`arch/s390/kernel/head64.o' being placed in section `.rela.dyn'
Orphan sections are sections that exist in an object file but don't have
a corresponding output section in the final executable. ld raises a
warning when it identifies such sections.
Eliminate the warning by placing all .rela orphan sections in .rela.dyn
and raise an error when size of .rela.dyn is greater than zero. i.e.
Dont just neglect orphan sections.
This is similar to adjustment performed in x86, where kernel is built
with -fno-PIE.
commit 5354e84598f2 ("x86/build: Add asserts for unwanted sections")
[sumanthk@linux.ibm.com: rebased Josh Poimboeuf patches and move
vmlinux.relocs to safe location]
[hca@linux.ibm.com: merged compile warning fix from Sumanth]
Tested-by: Sumanth Korikkar <sumanthk@linux.ibm.com>
Acked-by: Vasily Gorbik <gor@linux.ibm.com>
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: Sumanth Korikkar <sumanthk@linux.ibm.com>
Link: https://lore.kernel.org/r/20240219132734.22881-4-sumanthk@linux.ibm.com
Link: https://lore.kernel.org/r/20240219132734.22881-5-sumanthk@linux.ibm.com
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
2024-02-19 21:27:33 +08:00
|
|
|
else
|
|
|
|
KBUILD_CFLAGS += $(call cc-option,-munaligned-symbols,)
|
|
|
|
LDFLAGS_vmlinux := --emit-relocs --discard-none
|
|
|
|
extra_tools := relocs
|
|
|
|
endif
|
2018-06-29 01:22:21 +08:00
|
|
|
aflags_dwarf := -Wa,-gdwarf-2
|
2019-04-15 16:35:52 +08:00
|
|
|
KBUILD_AFLAGS_DECOMPRESSOR := $(CLANG_FLAGS) -m64 -D__ASSEMBLY__
|
2022-05-11 20:05:31 +08:00
|
|
|
ifndef CONFIG_AS_IS_LLVM
|
2018-06-29 01:22:21 +08:00
|
|
|
KBUILD_AFLAGS_DECOMPRESSOR += $(if $(CONFIG_DEBUG_INFO),$(aflags_dwarf))
|
2022-05-11 20:05:31 +08:00
|
|
|
endif
|
2022-01-29 07:34:13 +08:00
|
|
|
KBUILD_CFLAGS_DECOMPRESSOR := $(CLANG_FLAGS) -m64 -O2 -mpacked-stack
|
2018-06-15 18:28:05 +08:00
|
|
|
KBUILD_CFLAGS_DECOMPRESSOR += -DDISABLE_BRANCH_PROFILING -D__NO_FORTIFY
|
2024-03-07 20:28:27 +08:00
|
|
|
KBUILD_CFLAGS_DECOMPRESSOR += -D__DECOMPRESSOR
|
2020-11-11 00:05:35 +08:00
|
|
|
KBUILD_CFLAGS_DECOMPRESSOR += -fno-delete-null-pointer-checks -msoft-float -mbackchain
|
2018-06-15 18:28:05 +08:00
|
|
|
KBUILD_CFLAGS_DECOMPRESSOR += -fno-asynchronous-unwind-tables
|
2020-06-27 02:59:13 +08:00
|
|
|
KBUILD_CFLAGS_DECOMPRESSOR += -ffreestanding
|
2021-05-10 13:31:33 +08:00
|
|
|
KBUILD_CFLAGS_DECOMPRESSOR += -fno-stack-protector
|
2023-06-22 20:55:08 +08:00
|
|
|
KBUILD_CFLAGS_DECOMPRESSOR += -fPIE
|
2019-06-04 19:10:51 +08:00
|
|
|
KBUILD_CFLAGS_DECOMPRESSOR += $(call cc-disable-warning, address-of-packed-member)
|
2018-06-29 01:22:21 +08:00
|
|
|
KBUILD_CFLAGS_DECOMPRESSOR += $(if $(CONFIG_DEBUG_INFO),-g)
|
|
|
|
KBUILD_CFLAGS_DECOMPRESSOR += $(if $(CONFIG_DEBUG_INFO_DWARF4), $(call cc-option, -gdwarf-4,))
|
gcc-12: disable '-Warray-bounds' universally for now
In commit 8b202ee21839 ("s390: disable -Warray-bounds") the s390 people
disabled the '-Warray-bounds' warning for gcc-12, because the new logic
in gcc would cause warnings for their use of the S390_lowcore macro,
which accesses absolute pointers.
It turns out gcc-12 has many other issues in this area, so this takes
that s390 warning disable logic, and turns it into a kernel build config
entry instead.
Part of the intent is that we can make this all much more targeted, and
use this conflig flag to disable it in only particular configurations
that cause problems, with the s390 case as an example:
select GCC12_NO_ARRAY_BOUNDS
and we could do that for other configuration cases that cause issues.
Or we could possibly use the CONFIG_CC_NO_ARRAY_BOUNDS thing in a more
targeted way, and disable the warning only for particular uses: again
the s390 case as an example:
KBUILD_CFLAGS_DECOMPRESSOR += $(if $(CONFIG_CC_NO_ARRAY_BOUNDS),-Wno-array-bounds)
but this ends up just doing it globally in the top-level Makefile, since
the current issues are spread fairly widely all over:
KBUILD_CFLAGS-$(CONFIG_CC_NO_ARRAY_BOUNDS) += -Wno-array-bounds
We'll try to limit this later, since the gcc-12 problems are rare enough
that *much* of the kernel can be built with it without disabling this
warning.
Cc: Kees Cook <keescook@chromium.org>
Cc: Nathan Chancellor <nathan@kernel.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2022-06-10 01:11:12 +08:00
|
|
|
KBUILD_CFLAGS_DECOMPRESSOR += $(if $(CONFIG_CC_NO_ARRAY_BOUNDS),-Wno-array-bounds)
|
2022-04-25 20:17:42 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
UTS_MACHINE := s390x
|
2018-10-26 21:29:59 +08:00
|
|
|
STACK_SIZE := $(if $(CONFIG_KASAN),65536,16384)
|
2018-05-29 02:27:35 +08:00
|
|
|
CHECKFLAGS += -D__s390__ -D__s390x__
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2010-02-27 05:37:53 +08:00
|
|
|
export LD_BFD
|
|
|
|
|
2014-08-14 22:06:02 +08:00
|
|
|
mflags-$(CONFIG_MARCH_Z10) := -march=z10
|
|
|
|
mflags-$(CONFIG_MARCH_Z196) := -march=z196
|
|
|
|
mflags-$(CONFIG_MARCH_ZEC12) := -march=zEC12
|
2017-04-12 20:17:25 +08:00
|
|
|
mflags-$(CONFIG_MARCH_Z13) := -march=z13
|
|
|
|
mflags-$(CONFIG_MARCH_Z14) := -march=z14
|
2019-02-06 15:22:11 +08:00
|
|
|
mflags-$(CONFIG_MARCH_Z15) := -march=z15
|
2021-07-20 20:28:08 +08:00
|
|
|
mflags-$(CONFIG_MARCH_Z16) := -march=z16
|
2014-08-14 22:06:02 +08:00
|
|
|
|
2015-07-08 16:20:04 +08:00
|
|
|
export CC_FLAGS_MARCH := $(mflags-y)
|
|
|
|
|
2014-08-14 22:06:02 +08:00
|
|
|
aflags-y += $(mflags-y)
|
|
|
|
cflags-y += $(mflags-y)
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2013-10-30 19:12:50 +08:00
|
|
|
cflags-$(CONFIG_MARCH_Z10_TUNE) += -mtune=z10
|
|
|
|
cflags-$(CONFIG_MARCH_Z196_TUNE) += -mtune=z196
|
|
|
|
cflags-$(CONFIG_MARCH_ZEC12_TUNE) += -mtune=zEC12
|
2017-04-12 20:17:25 +08:00
|
|
|
cflags-$(CONFIG_MARCH_Z13_TUNE) += -mtune=z13
|
|
|
|
cflags-$(CONFIG_MARCH_Z14_TUNE) += -mtune=z14
|
2019-02-06 15:22:11 +08:00
|
|
|
cflags-$(CONFIG_MARCH_Z15_TUNE) += -mtune=z15
|
2021-07-20 20:28:08 +08:00
|
|
|
cflags-$(CONFIG_MARCH_Z16_TUNE) += -mtune=z16
|
2013-10-30 19:12:50 +08:00
|
|
|
|
2016-09-06 16:46:36 +08:00
|
|
|
cflags-y += -Wa,-I$(srctree)/arch/$(ARCH)/include
|
|
|
|
|
2006-07-03 15:24:38 +08:00
|
|
|
#
|
|
|
|
# Prevent tail-call optimizations, to get clearer backtraces:
|
|
|
|
#
|
|
|
|
cflags-$(CONFIG_FRAME_POINTER) += -fno-optimize-sibling-calls
|
|
|
|
|
2018-06-15 18:28:05 +08:00
|
|
|
KBUILD_AFLAGS_DECOMPRESSOR += $(aflags-y)
|
|
|
|
KBUILD_CFLAGS_DECOMPRESSOR += $(cflags-y)
|
|
|
|
|
2021-08-17 08:21:04 +08:00
|
|
|
ifneq ($(call cc-option,-mstack-size=8192 -mstack-guard=128),)
|
2021-11-11 17:58:26 +08:00
|
|
|
CC_FLAGS_CHECK_STACK := -mstack-size=$(STACK_SIZE)
|
|
|
|
ifeq ($(call cc-option,-mstack-size=8192),)
|
|
|
|
CC_FLAGS_CHECK_STACK += -mstack-guard=$(CONFIG_STACK_GUARD)
|
|
|
|
endif
|
|
|
|
export CC_FLAGS_CHECK_STACK
|
|
|
|
cflags-$(CONFIG_CHECK_STACK) += $(CC_FLAGS_CHECK_STACK)
|
2007-04-27 22:01:46 +08:00
|
|
|
endif
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2018-01-26 19:46:47 +08:00
|
|
|
ifdef CONFIG_EXPOLINE
|
2022-03-07 03:56:07 +08:00
|
|
|
ifdef CONFIG_EXPOLINE_EXTERN
|
2022-06-27 20:50:53 +08:00
|
|
|
KBUILD_LDFLAGS_MODULE += arch/s390/lib/expoline/expoline.o
|
2022-03-07 03:56:07 +08:00
|
|
|
CC_FLAGS_EXPOLINE := -mindirect-branch=thunk-extern
|
|
|
|
CC_FLAGS_EXPOLINE += -mfunction-return=thunk-extern
|
|
|
|
else
|
2018-01-26 19:46:47 +08:00
|
|
|
CC_FLAGS_EXPOLINE := -mindirect-branch=thunk
|
|
|
|
CC_FLAGS_EXPOLINE += -mfunction-return=thunk
|
|
|
|
endif
|
2022-03-07 03:56:07 +08:00
|
|
|
CC_FLAGS_EXPOLINE += -mindirect-branch-table
|
|
|
|
export CC_FLAGS_EXPOLINE
|
|
|
|
cflags-y += $(CC_FLAGS_EXPOLINE) -DCC_USING_EXPOLINE
|
|
|
|
aflags-y += -DCC_USING_EXPOLINE
|
2018-01-26 19:46:47 +08:00
|
|
|
endif
|
|
|
|
|
2015-01-09 20:08:28 +08:00
|
|
|
ifdef CONFIG_FUNCTION_TRACER
|
2021-08-17 08:21:04 +08:00
|
|
|
ifeq ($(call cc-option,-mfentry -mnop-mcount),)
|
2018-08-06 21:17:47 +08:00
|
|
|
# make use of hotpatch feature if the compiler supports it
|
|
|
|
cc_hotpatch := -mhotpatch=0,3
|
2021-08-17 08:21:04 +08:00
|
|
|
ifneq ($(call cc-option,$(cc_hotpatch)),)
|
2018-08-06 21:17:47 +08:00
|
|
|
CC_FLAGS_FTRACE := $(cc_hotpatch)
|
|
|
|
KBUILD_AFLAGS += -DCC_USING_HOTPATCH
|
|
|
|
KBUILD_CFLAGS += -DCC_USING_HOTPATCH
|
|
|
|
endif
|
|
|
|
endif
|
2015-01-09 20:08:28 +08:00
|
|
|
endif
|
|
|
|
|
2017-11-20 18:46:13 +08:00
|
|
|
# Test CFI features of binutils
|
|
|
|
cfi := $(call as-instr,.cfi_startproc\n.cfi_val_offset 15$(comma)-160\n.cfi_endproc,-DCONFIG_AS_CFI_VAL_OFFSET=1)
|
|
|
|
|
2022-01-29 07:34:13 +08:00
|
|
|
KBUILD_CFLAGS += -mpacked-stack -mbackchain -msoft-float $(cflags-y)
|
2019-04-09 05:26:14 +08:00
|
|
|
KBUILD_CFLAGS += -pipe -Wno-sign-compare
|
2017-11-20 18:46:13 +08:00
|
|
|
KBUILD_CFLAGS += -fno-asynchronous-unwind-tables $(cfi)
|
|
|
|
KBUILD_AFLAGS += $(aflags-y) $(cfi)
|
2018-06-15 18:28:05 +08:00
|
|
|
export KBUILD_AFLAGS_DECOMPRESSOR
|
|
|
|
export KBUILD_CFLAGS_DECOMPRESSOR
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
OBJCOPYFLAGS := -O binary
|
|
|
|
|
2007-02-21 17:55:46 +08:00
|
|
|
libs-y += arch/s390/lib/
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-02-21 17:55:46 +08:00
|
|
|
boot := arch/s390/boot
|
2017-12-11 21:54:08 +08:00
|
|
|
syscalls := arch/s390/kernel/syscalls
|
2015-02-02 14:08:44 +08:00
|
|
|
tools := arch/s390/tools
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2018-06-11 20:35:01 +08:00
|
|
|
all: bzImage
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2018-02-20 18:31:34 +08:00
|
|
|
#KBUILD_IMAGE is necessary for packaging targets like rpm-pkg, deb-pkg...
|
|
|
|
KBUILD_IMAGE := $(boot)/bzImage
|
|
|
|
|
2020-02-16 22:48:29 +08:00
|
|
|
install:
|
2022-05-03 10:47:16 +08:00
|
|
|
$(call cmd,install)
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2018-06-11 20:35:01 +08:00
|
|
|
bzImage: vmlinux
|
2005-04-17 06:20:36 +08:00
|
|
|
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
|
|
|
|
2007-04-27 22:01:49 +08:00
|
|
|
zfcpdump:
|
|
|
|
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
|
|
|
|
2017-12-11 21:54:08 +08:00
|
|
|
archheaders:
|
|
|
|
$(Q)$(MAKE) $(build)=$(syscalls) uapi
|
|
|
|
|
2015-02-02 14:08:44 +08:00
|
|
|
archprepare:
|
2017-12-11 21:54:08 +08:00
|
|
|
$(Q)$(MAKE) $(build)=$(syscalls) kapi
|
s390: compile relocatable kernel without -fPIE
On s390, currently kernel uses the '-fPIE' compiler flag for compiling
vmlinux. This has a few problems:
- It uses dynamic symbols (.dynsym), for which the linker refuses to
allow more than 64k sections. This can break features which use
'-ffunction-sections' and '-fdata-sections', including kpatch-build
[1] and Function Granular KASLR.
- It unnecessarily uses GOT relocations, adding an extra layer of
indirection for many memory accesses.
Instead of using '-fPIE', resolve all the relocations at link time and
then manually adjust any absolute relocations (R_390_64) during boot.
This is done by first telling the linker to preserve all relocations
during the vmlinux link. (Note this is harmless: they are later
stripped in the vmlinux.bin link.)
Then use the 'relocs' tool to find all absolute relocations (R_390_64)
which apply to allocatable sections. The offsets of those relocations
are saved in a special section which is then used to adjust the
relocations during boot.
(Note: For some reason, Clang occasionally creates a GOT reference, even
without '-fPIE'. So Clang-compiled kernels have a GOT, which needs to
be adjusted.)
On my mostly-defconfig kernel, this reduces kernel text size by ~1.3%.
[1] https://github.com/dynup/kpatch/issues/1284
[2] https://gcc.gnu.org/pipermail/gcc-patches/2023-June/622872.html
[3] https://gcc.gnu.org/pipermail/gcc-patches/2023-August/625986.html
Compiler consideration:
Gcc recently implemented an optimization [2] for loading symbols without
explicit alignment, aligning with the IBM Z ELF ABI. This ABI mandates
symbols to reside on a 2-byte boundary, enabling the use of the larl
instruction. However, kernel linker scripts may still generate unaligned
symbols. To address this, a new -munaligned-symbols option has been
introduced [3] in recent gcc versions. This option has to be used with
future gcc versions.
Older Clang lacks support for handling unaligned symbols generated
by kernel linker scripts when the kernel is built without -fPIE. However,
future versions of Clang will include support for the -munaligned-symbols
option. When the support is unavailable, compile the kernel with -fPIE
to maintain the existing behavior.
In addition to it:
move vmlinux.relocs to safe relocation
When the kernel is built with CONFIG_KERNEL_UNCOMPRESSED, the entire
uncompressed vmlinux.bin is positioned in the bzImage decompressor
image at the default kernel LMA of 0x100000, enabling it to be executed
in-place. However, the size of .vmlinux.relocs could be large enough to
cause an overlap with the uncompressed kernel at the address 0x100000.
To address this issue, .vmlinux.relocs is positioned after the
.rodata.compressed in the bzImage. Nevertheless, in this configuration,
vmlinux.relocs will overlap with the .bss section of vmlinux.bin. To
overcome that, move vmlinux.relocs to a safe location before clearing
.bss and handling relocs.
Compile warning fix from Sumanth Korikkar:
When kernel is built with CONFIG_LD_ORPHAN_WARN and -fno-PIE, there are
several warnings:
ld: warning: orphan section `.rela.iplt' from
`arch/s390/kernel/head64.o' being placed in section `.rela.dyn'
ld: warning: orphan section `.rela.head.text' from
`arch/s390/kernel/head64.o' being placed in section `.rela.dyn'
ld: warning: orphan section `.rela.init.text' from
`arch/s390/kernel/head64.o' being placed in section `.rela.dyn'
ld: warning: orphan section `.rela.rodata.cst8' from
`arch/s390/kernel/head64.o' being placed in section `.rela.dyn'
Orphan sections are sections that exist in an object file but don't have
a corresponding output section in the final executable. ld raises a
warning when it identifies such sections.
Eliminate the warning by placing all .rela orphan sections in .rela.dyn
and raise an error when size of .rela.dyn is greater than zero. i.e.
Dont just neglect orphan sections.
This is similar to adjustment performed in x86, where kernel is built
with -fno-PIE.
commit 5354e84598f2 ("x86/build: Add asserts for unwanted sections")
[sumanthk@linux.ibm.com: rebased Josh Poimboeuf patches and move
vmlinux.relocs to safe location]
[hca@linux.ibm.com: merged compile warning fix from Sumanth]
Tested-by: Sumanth Korikkar <sumanthk@linux.ibm.com>
Acked-by: Vasily Gorbik <gor@linux.ibm.com>
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: Sumanth Korikkar <sumanthk@linux.ibm.com>
Link: https://lore.kernel.org/r/20240219132734.22881-4-sumanthk@linux.ibm.com
Link: https://lore.kernel.org/r/20240219132734.22881-5-sumanthk@linux.ibm.com
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
2024-02-19 21:27:33 +08:00
|
|
|
$(Q)$(MAKE) $(build)=$(tools) kapi $(extra_tools)
|
2021-06-25 20:50:08 +08:00
|
|
|
ifeq ($(KBUILD_EXTMOD),)
|
|
|
|
# We need to generate vdso-offsets.h before compiling certain files in kernel/.
|
|
|
|
# In order to do that, we should use the archprepare target, but we can't since
|
|
|
|
# asm-offsets.h is included in some files used to generate vdso-offsets.h, and
|
|
|
|
# asm-offsets.h is built in prepare0, for which archprepare is a dependency.
|
|
|
|
# Therefore we need to generate the header after prepare0 has been made, hence
|
|
|
|
# this hack.
|
|
|
|
prepare: vdso_prepare
|
|
|
|
vdso_prepare: prepare0
|
|
|
|
$(Q)$(MAKE) $(build)=arch/s390/kernel/vdso64 include/generated/vdso64-offsets.h
|
|
|
|
$(if $(CONFIG_COMPAT),$(Q)$(MAKE) \
|
|
|
|
$(build)=arch/s390/kernel/vdso32 include/generated/vdso32-offsets.h)
|
2022-06-27 20:50:53 +08:00
|
|
|
|
kbuild: unify vdso_install rules
Currently, there is no standard implementation for vdso_install,
leading to various issues:
1. Code duplication
Many architectures duplicate similar code just for copying files
to the install destination.
Some architectures (arm, sparc, x86) create build-id symlinks,
introducing more code duplication.
2. Unintended updates of in-tree build artifacts
The vdso_install rule depends on the vdso files to install.
It may update in-tree build artifacts. This can be problematic,
as explained in commit 19514fc665ff ("arm, kbuild: make
"make install" not depend on vmlinux").
3. Broken code in some architectures
Makefile code is often copied from one architecture to another
without proper adaptation.
'make vdso_install' for parisc does not work.
'make vdso_install' for s390 installs vdso64, but not vdso32.
To address these problems, this commit introduces a generic vdso_install
rule.
Architectures that support vdso_install need to define vdso-install-y
in arch/*/Makefile. vdso-install-y lists the files to install.
For example, arch/x86/Makefile looks like this:
vdso-install-$(CONFIG_X86_64) += arch/x86/entry/vdso/vdso64.so.dbg
vdso-install-$(CONFIG_X86_X32_ABI) += arch/x86/entry/vdso/vdsox32.so.dbg
vdso-install-$(CONFIG_X86_32) += arch/x86/entry/vdso/vdso32.so.dbg
vdso-install-$(CONFIG_IA32_EMULATION) += arch/x86/entry/vdso/vdso32.so.dbg
These files will be installed to $(MODLIB)/vdso/ with the .dbg suffix,
if exists, stripped away.
vdso-install-y can optionally take the second field after the colon
separator. This is needed because some architectures install a vdso
file as a different base name.
The following is a snippet from arch/arm64/Makefile.
vdso-install-$(CONFIG_COMPAT_VDSO) += arch/arm64/kernel/vdso32/vdso.so.dbg:vdso32.so
This will rename vdso.so.dbg to vdso32.so during installation. If such
architectures change their implementation so that the base names match,
this workaround will go away.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Acked-by: Sven Schnelle <svens@linux.ibm.com> # s390
Reviewed-by: Nicolas Schier <nicolas@fjasle.eu>
Reviewed-by: Guo Ren <guoren@kernel.org>
Acked-by: Helge Deller <deller@gmx.de> # parisc
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
2023-10-14 18:54:35 +08:00
|
|
|
vdso-install-y += arch/s390/kernel/vdso64/vdso64.so.dbg
|
|
|
|
vdso-install-$(CONFIG_COMPAT) += arch/s390/kernel/vdso32/vdso32.so.dbg
|
|
|
|
|
2022-06-27 20:50:53 +08:00
|
|
|
ifdef CONFIG_EXPOLINE_EXTERN
|
|
|
|
modules_prepare: expoline_prepare
|
2023-03-16 19:28:09 +08:00
|
|
|
expoline_prepare: scripts
|
2022-06-27 20:50:53 +08:00
|
|
|
$(Q)$(MAKE) $(build)=arch/s390/lib/expoline arch/s390/lib/expoline/expoline.o
|
|
|
|
endif
|
2021-06-25 20:50:08 +08:00
|
|
|
endif
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
# Don't use tabs in echo arguments
|
|
|
|
define archhelp
|
2018-06-11 20:35:01 +08:00
|
|
|
echo '* bzImage - Kernel image for IPL ($(boot)/bzImage)'
|
2015-11-25 18:54:36 +08:00
|
|
|
echo ' install - Install kernel using'
|
|
|
|
echo ' (your) ~/bin/$(INSTALLKERNEL) or'
|
|
|
|
echo ' (distribution) /sbin/$(INSTALLKERNEL) or'
|
|
|
|
echo ' install to $$(INSTALL_PATH)'
|
2005-04-17 06:20:36 +08:00
|
|
|
endef
|