Commit | Line | Data |
---|---|---|
b2441318 | 1 | # SPDX-License-Identifier: GPL-2.0 |
f4f75ad5 AB |
2 | # |
3 | # The stub may be linked into the kernel proper or into a separate boot binary, | |
4 | # but in either case, it executes before the kernel does (with MMU disabled) so | |
5 | # things like ftrace and stack-protector are likely to cause trouble if left | |
6 | # enabled, even if doing so doesn't break the build. | |
7 | # | |
0d60ffee AB |
8 | |
9 | # non-x86 reuses KBUILD_CFLAGS, x86 does not | |
10 | cflags-y := $(KBUILD_CFLAGS) | |
11 | ||
f4f75ad5 | 12 | cflags-$(CONFIG_X86_32) := -march=i386 |
769e0fe1 | 13 | cflags-$(CONFIG_X86_64) := -mcmodel=small |
bbf8e8b0 | 14 | cflags-$(CONFIG_X86) += -m$(BITS) -D__KERNEL__ \ |
f4f75ad5 | 15 | -fPIC -fno-strict-aliasing -mno-red-zone \ |
3db5e0ba NC |
16 | -mno-mmx -mno-sse -fshort-wchar \ |
17 | -Wno-pointer-sign \ | |
18 | $(call cc-disable-warning, address-of-packed-member) \ | |
003602ad | 19 | $(call cc-disable-warning, gnu) \ |
58d746c1 NC |
20 | -fno-asynchronous-unwind-tables \ |
21 | $(CLANG_FLAGS) | |
f4f75ad5 | 22 | |
ce279d37 LA |
23 | # arm64 uses the full KBUILD_CFLAGS so it's necessary to explicitly |
24 | # disable the stackleak plugin | |
0d60ffee | 25 | cflags-$(CONFIG_ARM64) += -fpie $(DISABLE_STACKLEAK_PLUGIN) \ |
8358098b | 26 | -fno-unwind-tables -fno-asynchronous-unwind-tables |
2e6fa86f | 27 | cflags-$(CONFIG_ARM) += -DEFI_HAVE_STRLEN -DEFI_HAVE_STRNLEN \ |
da8dd0c7 AB |
28 | -DEFI_HAVE_MEMCHR -DEFI_HAVE_STRRCHR \ |
29 | -DEFI_HAVE_STRCMP -fno-builtin -fpic \ | |
41f1c484 | 30 | $(call cc-option,-mno-single-pic-base) |
afb2a4fb | 31 | cflags-$(CONFIG_RISCV) += -fpic -DNO_ALTERNATIVE -mno-relax |
0d60ffee | 32 | cflags-$(CONFIG_LOONGARCH) += -fpie |
f4f75ad5 | 33 | |
40cd01a9 | 34 | cflags-$(CONFIG_EFI_PARAMS_FROM_FDT) += -I$(srctree)/scripts/dtc/libfdt |
e8f3010f | 35 | |
0d60ffee AB |
36 | KBUILD_CFLAGS := $(subst $(CC_FLAGS_FTRACE),,$(cflags-y)) \ |
37 | -Os -DDISABLE_BRANCH_PROFILING \ | |
e544ea57 | 38 | -include $(srctree)/include/linux/hidden.h \ |
3e2c044a | 39 | -D__NO_FORTIFY \ |
685969e0 | 40 | -ffreestanding \ |
893ab004 | 41 | -fno-stack-protector \ |
f77767ed | 42 | $(call cc-option,-fno-addrsig) \ |
f922c4ab | 43 | -D__DISABLE_EXPORTS |
f4f75ad5 | 44 | |
1a388792 AB |
45 | # |
46 | # struct randomization only makes sense for Linux internal types, which the EFI | |
47 | # stub code never touches, so let's turn off struct randomization for the stub | |
48 | # altogether | |
49 | # | |
50 | KBUILD_CFLAGS := $(filter-out $(RANDSTRUCT_CFLAGS), $(KBUILD_CFLAGS)) | |
51 | ||
cc49c71d ST |
52 | # remove SCS flags from all objects in this directory |
53 | KBUILD_CFLAGS := $(filter-out $(CC_FLAGS_SCS), $(KBUILD_CFLAGS)) | |
f143ff39 ST |
54 | # disable CFI |
55 | KBUILD_CFLAGS := $(filter-out $(CC_FLAGS_CFI), $(KBUILD_CFLAGS)) | |
6e20f185 ST |
56 | # disable LTO |
57 | KBUILD_CFLAGS := $(filter-out $(CC_FLAGS_LTO), $(KBUILD_CFLAGS)) | |
cc49c71d | 58 | |
0d959814 | 59 | lib-y := efi-stub-helper.o gop.o secureboot.o tpm.o \ |
91d150c0 | 60 | file.o mem.o random.o randomalloc.o pci.o \ |
43b1df0e | 61 | skip_spaces.o lib-cmdline.o lib-ctype.o \ |
2e6fa86f | 62 | alignedmem.o relocate.o printk.o vsprintf.o |
e8f3010f | 63 | |
40cd01a9 AB |
64 | # include the stub's libfdt dependencies from lib/ when needed |
65 | libfdt-deps := fdt_rw.c fdt_ro.c fdt_wip.c fdt.c \ | |
66 | fdt_empty_tree.c fdt_sw.c | |
67 | ||
68 | lib-$(CONFIG_EFI_PARAMS_FROM_FDT) += fdt.o \ | |
69 | $(patsubst %.c,lib-%.o,$(libfdt-deps)) | |
e8f3010f AB |
70 | |
71 | $(obj)/lib-%.o: $(srctree)/lib/%.c FORCE | |
72 | $(call if_changed_rule,cc_o_c) | |
73 | ||
732ea9db | 74 | lib-$(CONFIG_EFI_GENERIC_STUB) += efi-stub.o string.o intrinsics.o systable.o \ |
42c8ea3d | 75 | screen_info.o efi-stub-entry.o |
f4f75ad5 | 76 | |
81a0bc39 | 77 | lib-$(CONFIG_ARM) += arm32-stub.o |
6b56beb5 | 78 | lib-$(CONFIG_ARM64) += kaslr.o arm64.o arm64-stub.o smbios.o |
c2d0b470 | 79 | lib-$(CONFIG_X86) += x86-stub.o |
cb1c9e02 | 80 | lib-$(CONFIG_X86_64) += x86-5lvl.o |
b7ac4b8e | 81 | lib-$(CONFIG_RISCV) += kaslr.o riscv.o riscv-stub.o |
d729b554 | 82 | lib-$(CONFIG_LOONGARCH) += loongarch.o loongarch-stub.o |
ead384d9 | 83 | |
41cd96fa | 84 | CFLAGS_arm32-stub.o := -DTEXT_OFFSET=$(TEXT_OFFSET) |
bf457786 | 85 | |
a0509109 AB |
86 | zboot-obj-$(CONFIG_RISCV) := lib-clz_ctz.o lib-ashldi3.o |
87 | lib-$(CONFIG_EFI_ZBOOT) += zboot.o $(zboot-obj-y) | |
88 | ||
745e3ed8 KS |
89 | lib-$(CONFIG_UNACCEPTED_MEMORY) += unaccepted_memory.o bitmap.o find.o |
90 | ||
a0509109 AB |
91 | extra-y := $(lib-y) |
92 | lib-y := $(patsubst %.o,%.stub.o,$(lib-y)) | |
93 | ||
e2179a09 KC |
94 | # Even when -mbranch-protection=none is set, Clang will generate a |
95 | # .note.gnu.property for code-less object files (like lib/ctype.c), | |
96 | # so work around this by explicitly removing the unwanted section. | |
2947a456 | 97 | # https://llvm.org/pr46480 |
e2179a09 KC |
98 | STUBCOPY_FLAGS-y += --remove-section=.note.gnu.property |
99 | ||
26a92425 AS |
100 | STUBCOPY_RELOC-$(CONFIG_X86_32) := R_386_32 |
101 | STUBCOPY_RELOC-$(CONFIG_X86_64) := R_X86_64_64 | |
102 | ||
103 | # | |
104 | # ARM discards the .data section because it disallows r/w data in the | |
105 | # decompressor. So move our .data to .data.efistub and .bss to .bss.efistub, | |
106 | # which are preserved explicitly by the decompressor linker script. | |
107 | # | |
108 | STUBCOPY_FLAGS-$(CONFIG_ARM) += --rename-section .data=.data.efistub \ | |
109 | --rename-section .bss=.bss.efistub,load,alloc | |
110 | STUBCOPY_RELOC-$(CONFIG_ARM) := R_ARM_ABS | |
111 | ||
ddeeefe2 AB |
112 | # |
113 | # arm64 puts the stub in the kernel proper, which will unnecessarily retain all | |
114 | # code indefinitely unless it is annotated as __init/__initdata/__initconst etc. | |
115 | # So let's apply the __init annotations at the section level, by prefixing | |
116 | # the section names directly. This will ensure that even all the inline string | |
117 | # literals are covered. | |
e8f3010f AB |
118 | # The fact that the stub and the kernel proper are essentially the same binary |
119 | # also means that we need to be extra careful to make sure that the stub does | |
120 | # not rely on any absolute symbol references, considering that the virtual | |
121 | # kernel mapping that the linker uses is not active yet when the stub is | |
122 | # executing. So build all C dependencies of the EFI stub into libstub, and do | |
123 | # a verification pass to see if any absolute relocations exist in any of the | |
124 | # object files. | |
ddeeefe2 | 125 | # |
e8f3010f AB |
126 | STUBCOPY_FLAGS-$(CONFIG_ARM64) += --prefix-alloc-sections=.init \ |
127 | --prefix-symbols=__efistub_ | |
61786170 | 128 | STUBCOPY_RELOC-$(CONFIG_ARM64) := R_AARCH64_ABS |
e8f3010f | 129 | |
d7071743 AP |
130 | # For RISC-V, we don't need anything special other than arm64. Keep all the |
131 | # symbols in .init section and make sure that no absolute symbols references | |
f6e6e95c | 132 | # exist. |
d7071743 AP |
133 | STUBCOPY_FLAGS-$(CONFIG_RISCV) += --prefix-alloc-sections=.init \ |
134 | --prefix-symbols=__efistub_ | |
d2baf8cc | 135 | STUBCOPY_RELOC-$(CONFIG_RISCV) := -E R_RISCV_HI20\|R_RISCV_$(BITS)\|R_RISCV_RELAX |
d7071743 | 136 | |
ead384d9 HC |
137 | # For LoongArch, keep all the symbols in .init section and make sure that no |
138 | # absolute symbols references exist. | |
139 | STUBCOPY_FLAGS-$(CONFIG_LOONGARCH) += --prefix-alloc-sections=.init \ | |
140 | --prefix-symbols=__efistub_ | |
141 | STUBCOPY_RELOC-$(CONFIG_LOONGARCH) := R_LARCH_MARK_LA | |
142 | ||
e8f3010f AB |
143 | $(obj)/%.stub.o: $(obj)/%.o FORCE |
144 | $(call if_changed,stubcopy) | |
ddeeefe2 | 145 | |
696204fa AB |
146 | # |
147 | # Strip debug sections and some other sections that may legally contain | |
148 | # absolute relocations, so that we can inspect the remaining sections for | |
149 | # such relocations. If none are found, regenerate the output object, but | |
150 | # this time, use objcopy and leave all sections in place. | |
151 | # | |
e8f3010f | 152 | quiet_cmd_stubcopy = STUBCPY $@ |
e8d368ad | 153 | cmd_stubcopy = \ |
02562d0c | 154 | $(STRIP) --strip-debug -o $@ $<; \ |
e8d368ad MY |
155 | if $(OBJDUMP) -r $@ | grep $(STUBCOPY_RELOC-y); then \ |
156 | echo "$@: absolute symbol references not allowed in the EFI stub" >&2; \ | |
157 | /bin/false; \ | |
158 | fi; \ | |
159 | $(OBJCOPY) $(STUBCOPY_FLAGS-y) $< $@ |