.. | .. |
---|
7 | 7 | # |
---|
8 | 8 | cflags-$(CONFIG_X86_32) := -march=i386 |
---|
9 | 9 | cflags-$(CONFIG_X86_64) := -mcmodel=small |
---|
10 | | -cflags-$(CONFIG_X86) += -m$(BITS) -D__KERNEL__ -O2 \ |
---|
| 10 | +cflags-$(CONFIG_X86) += -m$(BITS) -D__KERNEL__ \ |
---|
11 | 11 | -fPIC -fno-strict-aliasing -mno-red-zone \ |
---|
12 | 12 | -mno-mmx -mno-sse -fshort-wchar \ |
---|
13 | 13 | -Wno-pointer-sign \ |
---|
14 | 14 | $(call cc-disable-warning, address-of-packed-member) \ |
---|
15 | | - $(call cc-disable-warning, gnu) |
---|
| 15 | + $(call cc-disable-warning, gnu) \ |
---|
| 16 | + -fno-asynchronous-unwind-tables \ |
---|
| 17 | + $(CLANG_FLAGS) |
---|
16 | 18 | |
---|
17 | 19 | # arm64 uses the full KBUILD_CFLAGS so it's necessary to explicitly |
---|
18 | 20 | # disable the stackleak plugin |
---|
19 | | -cflags-$(CONFIG_ARM64) := $(subst -pg,,$(KBUILD_CFLAGS)) -fpie \ |
---|
20 | | - $(DISABLE_STACKLEAK_PLUGIN) |
---|
21 | | -cflags-$(CONFIG_ARM) := $(subst -pg,,$(KBUILD_CFLAGS)) \ |
---|
| 21 | +cflags-$(CONFIG_ARM64) := $(subst $(CC_FLAGS_FTRACE),,$(KBUILD_CFLAGS)) \ |
---|
| 22 | + -fpie $(DISABLE_STACKLEAK_PLUGIN) \ |
---|
| 23 | + $(call cc-option,-mbranch-protection=none) |
---|
| 24 | +cflags-$(CONFIG_ARM) := $(subst $(CC_FLAGS_FTRACE),,$(KBUILD_CFLAGS)) \ |
---|
22 | 25 | -fno-builtin -fpic \ |
---|
23 | 26 | $(call cc-option,-mno-single-pic-base) |
---|
| 27 | +cflags-$(CONFIG_RISCV) := $(subst $(CC_FLAGS_FTRACE),,$(KBUILD_CFLAGS)) \ |
---|
| 28 | + -fpic |
---|
24 | 29 | |
---|
25 | | -cflags-$(CONFIG_EFI_ARMSTUB) += -I$(srctree)/scripts/dtc/libfdt |
---|
| 30 | +cflags-$(CONFIG_EFI_GENERIC_STUB) += -I$(srctree)/scripts/dtc/libfdt |
---|
26 | 31 | |
---|
27 | | -KBUILD_CFLAGS := $(cflags-y) -DDISABLE_BRANCH_PROFILING \ |
---|
| 32 | +KBUILD_CFLAGS := $(cflags-y) -Os -DDISABLE_BRANCH_PROFILING \ |
---|
| 33 | + -include $(srctree)/include/linux/hidden.h \ |
---|
28 | 34 | -D__NO_FORTIFY \ |
---|
29 | | - $(call cc-option,-ffreestanding) \ |
---|
30 | | - $(call cc-option,-fno-stack-protector) \ |
---|
| 35 | + -ffreestanding \ |
---|
| 36 | + -fno-stack-protector \ |
---|
31 | 37 | $(call cc-option,-fno-addrsig) \ |
---|
32 | | - -D__DISABLE_EXPORTS \ |
---|
33 | | - $(DISABLE_LTO) |
---|
| 38 | + -D__DISABLE_EXPORTS |
---|
| 39 | + |
---|
| 40 | +# |
---|
| 41 | +# struct randomization only makes sense for Linux internal types, which the EFI |
---|
| 42 | +# stub code never touches, so let's turn off struct randomization for the stub |
---|
| 43 | +# altogether |
---|
| 44 | +# |
---|
| 45 | +KBUILD_CFLAGS := $(filter-out $(RANDSTRUCT_CFLAGS), $(KBUILD_CFLAGS)) |
---|
| 46 | + |
---|
| 47 | +# remove SCS flags from all objects in this directory |
---|
| 48 | +KBUILD_CFLAGS := $(filter-out $(CC_FLAGS_SCS), $(KBUILD_CFLAGS)) |
---|
| 49 | +# disable LTO |
---|
| 50 | +KBUILD_CFLAGS := $(filter-out $(CC_FLAGS_LTO), $(KBUILD_CFLAGS)) |
---|
34 | 51 | |
---|
35 | 52 | GCOV_PROFILE := n |
---|
| 53 | +# Sanitizer runtimes are unavailable and cannot be linked here. |
---|
36 | 54 | KASAN_SANITIZE := n |
---|
| 55 | +KCSAN_SANITIZE := n |
---|
37 | 56 | UBSAN_SANITIZE := n |
---|
38 | 57 | OBJECT_FILES_NON_STANDARD := y |
---|
39 | 58 | |
---|
40 | 59 | # Prevents link failures: __sanitizer_cov_trace_pc() is not linked in. |
---|
41 | 60 | KCOV_INSTRUMENT := n |
---|
42 | 61 | |
---|
43 | | -lib-y := efi-stub-helper.o gop.o secureboot.o tpm.o |
---|
| 62 | +lib-y := efi-stub-helper.o gop.o secureboot.o tpm.o \ |
---|
| 63 | + file.o mem.o random.o randomalloc.o pci.o \ |
---|
| 64 | + skip_spaces.o lib-cmdline.o lib-ctype.o \ |
---|
| 65 | + alignedmem.o relocate.o vsprintf.o |
---|
44 | 66 | |
---|
45 | 67 | # include the stub's generic dependencies from lib/ when building for ARM/arm64 |
---|
46 | | -arm-deps-y := fdt_rw.c fdt_ro.c fdt_wip.c fdt.c fdt_empty_tree.c fdt_sw.c |
---|
47 | | -arm-deps-$(CONFIG_ARM64) += sort.c |
---|
| 68 | +efi-deps-y := fdt_rw.c fdt_ro.c fdt_wip.c fdt.c fdt_empty_tree.c fdt_sw.c |
---|
48 | 69 | |
---|
49 | 70 | $(obj)/lib-%.o: $(srctree)/lib/%.c FORCE |
---|
50 | 71 | $(call if_changed_rule,cc_o_c) |
---|
51 | 72 | |
---|
52 | | -lib-$(CONFIG_EFI_ARMSTUB) += arm-stub.o fdt.o string.o random.o \ |
---|
53 | | - $(patsubst %.c,lib-%.o,$(arm-deps-y)) |
---|
| 73 | +lib-$(CONFIG_EFI_GENERIC_STUB) += efi-stub.o fdt.o string.o \ |
---|
| 74 | + $(patsubst %.c,lib-%.o,$(efi-deps-y)) |
---|
54 | 75 | |
---|
55 | 76 | lib-$(CONFIG_ARM) += arm32-stub.o |
---|
56 | 77 | lib-$(CONFIG_ARM64) += arm64-stub.o |
---|
57 | | -CFLAGS_arm64-stub.o := -DTEXT_OFFSET=$(TEXT_OFFSET) |
---|
| 78 | +lib-$(CONFIG_X86) += x86-stub.o |
---|
| 79 | +lib-$(CONFIG_RISCV) += riscv-stub.o |
---|
| 80 | +CFLAGS_arm32-stub.o := -DTEXT_OFFSET=$(TEXT_OFFSET) |
---|
| 81 | + |
---|
| 82 | +# Even when -mbranch-protection=none is set, Clang will generate a |
---|
| 83 | +# .note.gnu.property for code-less object files (like lib/ctype.c), |
---|
| 84 | +# so work around this by explicitly removing the unwanted section. |
---|
| 85 | +# https://bugs.llvm.org/show_bug.cgi?id=46480 |
---|
| 86 | +STUBCOPY_FLAGS-y += --remove-section=.note.gnu.property |
---|
| 87 | + |
---|
| 88 | +# |
---|
| 89 | +# For x86, bootloaders like systemd-boot or grub-efi do not zero-initialize the |
---|
| 90 | +# .bss section, so the .bss section of the EFI stub needs to be included in the |
---|
| 91 | +# .data section of the compressed kernel to ensure initialization. Rename the |
---|
| 92 | +# .bss section here so it's easy to pick out in the linker script. |
---|
| 93 | +# |
---|
| 94 | +STUBCOPY_FLAGS-$(CONFIG_X86) += --rename-section .bss=.bss.efistub,load,alloc |
---|
| 95 | +STUBCOPY_RELOC-$(CONFIG_X86_32) := R_386_32 |
---|
| 96 | +STUBCOPY_RELOC-$(CONFIG_X86_64) := R_X86_64_64 |
---|
| 97 | + |
---|
| 98 | +# |
---|
| 99 | +# ARM discards the .data section because it disallows r/w data in the |
---|
| 100 | +# decompressor. So move our .data to .data.efistub and .bss to .bss.efistub, |
---|
| 101 | +# which are preserved explicitly by the decompressor linker script. |
---|
| 102 | +# |
---|
| 103 | +STUBCOPY_FLAGS-$(CONFIG_ARM) += --rename-section .data=.data.efistub \ |
---|
| 104 | + --rename-section .bss=.bss.efistub,load,alloc |
---|
| 105 | +STUBCOPY_RELOC-$(CONFIG_ARM) := R_ARM_ABS |
---|
58 | 106 | |
---|
59 | 107 | # |
---|
60 | 108 | # arm64 puts the stub in the kernel proper, which will unnecessarily retain all |
---|
.. | .. |
---|
70 | 118 | # a verification pass to see if any absolute relocations exist in any of the |
---|
71 | 119 | # object files. |
---|
72 | 120 | # |
---|
73 | | -extra-$(CONFIG_EFI_ARMSTUB) := $(lib-y) |
---|
74 | | -lib-$(CONFIG_EFI_ARMSTUB) := $(patsubst %.o,%.stub.o,$(lib-y)) |
---|
| 121 | +extra-y := $(lib-y) |
---|
| 122 | +lib-y := $(patsubst %.o,%.stub.o,$(lib-y)) |
---|
75 | 123 | |
---|
76 | | -STUBCOPY_RM-y := -R *ksymtab* -R *kcrctab* |
---|
77 | 124 | STUBCOPY_FLAGS-$(CONFIG_ARM64) += --prefix-alloc-sections=.init \ |
---|
78 | 125 | --prefix-symbols=__efistub_ |
---|
79 | 126 | STUBCOPY_RELOC-$(CONFIG_ARM64) := R_AARCH64_ABS |
---|
| 127 | + |
---|
| 128 | +# For RISC-V, we don't need anything special other than arm64. Keep all the |
---|
| 129 | +# symbols in .init section and make sure that no absolute symbols references |
---|
| 130 | +# doesn't exist. |
---|
| 131 | +STUBCOPY_FLAGS-$(CONFIG_RISCV) += --prefix-alloc-sections=.init \ |
---|
| 132 | + --prefix-symbols=__efistub_ |
---|
| 133 | +STUBCOPY_RELOC-$(CONFIG_RISCV) := R_RISCV_HI20 |
---|
80 | 134 | |
---|
81 | 135 | $(obj)/%.stub.o: $(obj)/%.o FORCE |
---|
82 | 136 | $(call if_changed,stubcopy) |
---|
.. | .. |
---|
88 | 142 | # this time, use objcopy and leave all sections in place. |
---|
89 | 143 | # |
---|
90 | 144 | quiet_cmd_stubcopy = STUBCPY $@ |
---|
91 | | - cmd_stubcopy = if $(STRIP) --strip-debug $(STUBCOPY_RM-y) -o $@ $<; \ |
---|
92 | | - then if $(OBJDUMP) -r $@ | grep $(STUBCOPY_RELOC-y); \ |
---|
93 | | - then (echo >&2 "$@: absolute symbol references not allowed in the EFI stub"; \ |
---|
94 | | - rm -f $@; /bin/false); \ |
---|
95 | | - else $(OBJCOPY) $(STUBCOPY_FLAGS-y) $< $@; fi \ |
---|
96 | | - else /bin/false; fi |
---|
97 | | - |
---|
98 | | -# |
---|
99 | | -# ARM discards the .data section because it disallows r/w data in the |
---|
100 | | -# decompressor. So move our .data to .data.efistub, which is preserved |
---|
101 | | -# explicitly by the decompressor linker script. |
---|
102 | | -# |
---|
103 | | -STUBCOPY_FLAGS-$(CONFIG_ARM) += --rename-section .data=.data.efistub |
---|
104 | | -STUBCOPY_RELOC-$(CONFIG_ARM) := R_ARM_ABS |
---|
| 145 | + cmd_stubcopy = \ |
---|
| 146 | + $(STRIP) --strip-debug -o $@ $<; \ |
---|
| 147 | + if $(OBJDUMP) -r $@ | grep $(STUBCOPY_RELOC-y); then \ |
---|
| 148 | + echo "$@: absolute symbol references not allowed in the EFI stub" >&2; \ |
---|
| 149 | + /bin/false; \ |
---|
| 150 | + fi; \ |
---|
| 151 | + $(OBJCOPY) $(STUBCOPY_FLAGS-y) $< $@ |
---|