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 | # | |
8 | cflags-$(CONFIG_X86_32) := -march=i386 | |
769e0fe1 | 9 | cflags-$(CONFIG_X86_64) := -mcmodel=small |
bbf8e8b0 | 10 | cflags-$(CONFIG_X86) += -m$(BITS) -D__KERNEL__ \ |
f4f75ad5 | 11 | -fPIC -fno-strict-aliasing -mno-red-zone \ |
3db5e0ba NC |
12 | -mno-mmx -mno-sse -fshort-wchar \ |
13 | -Wno-pointer-sign \ | |
14 | $(call cc-disable-warning, address-of-packed-member) \ | |
003602ad AS |
15 | $(call cc-disable-warning, gnu) \ |
16 | -fno-asynchronous-unwind-tables | |
f4f75ad5 | 17 | |
ce279d37 LA |
18 | # arm64 uses the full KBUILD_CFLAGS so it's necessary to explicitly |
19 | # disable the stackleak plugin | |
e1a7eafb TD |
20 | cflags-$(CONFIG_ARM64) := $(subst $(CC_FLAGS_FTRACE),,$(KBUILD_CFLAGS)) \ |
21 | -fpie $(DISABLE_STACKLEAK_PLUGIN) | |
22 | cflags-$(CONFIG_ARM) := $(subst $(CC_FLAGS_FTRACE),,$(KBUILD_CFLAGS)) \ | |
41f1c484 AS |
23 | -fno-builtin -fpic \ |
24 | $(call cc-option,-mno-single-pic-base) | |
f4f75ad5 | 25 | |
2e0eb483 | 26 | cflags-$(CONFIG_EFI_GENERIC_STUB) += -I$(srctree)/scripts/dtc/libfdt |
e8f3010f | 27 | |
bbf8e8b0 | 28 | KBUILD_CFLAGS := $(cflags-y) -Os -DDISABLE_BRANCH_PROFILING \ |
6f05106e | 29 | -include $(srctree)/drivers/firmware/efi/libstub/hidden.h \ |
3e2c044a | 30 | -D__NO_FORTIFY \ |
f4f75ad5 | 31 | $(call cc-option,-ffreestanding) \ |
0b3e3366 | 32 | $(call cc-option,-fno-stack-protector) \ |
f77767ed | 33 | $(call cc-option,-fno-addrsig) \ |
f922c4ab | 34 | -D__DISABLE_EXPORTS |
f4f75ad5 | 35 | |
cc49c71d ST |
36 | # remove SCS flags from all objects in this directory |
37 | KBUILD_CFLAGS := $(filter-out $(CC_FLAGS_SCS), $(KBUILD_CFLAGS)) | |
38 | ||
f4f75ad5 | 39 | GCOV_PROFILE := n |
0ebba714 | 40 | # Sanitizer runtimes are unavailable and cannot be linked here. |
0b24becc | 41 | KASAN_SANITIZE := n |
0ebba714 | 42 | KCSAN_SANITIZE := n |
c6d30853 | 43 | UBSAN_SANITIZE := n |
c0dd6716 | 44 | OBJECT_FILES_NON_STANDARD := y |
f4f75ad5 | 45 | |
5c9a8750 DV |
46 | # Prevents link failures: __sanitizer_cov_trace_pc() is not linked in. |
47 | KCOV_INSTRUMENT := n | |
48 | ||
0d959814 | 49 | lib-y := efi-stub-helper.o gop.o secureboot.o tpm.o \ |
91d150c0 | 50 | file.o mem.o random.o randomalloc.o pci.o \ |
43b1df0e | 51 | skip_spaces.o lib-cmdline.o lib-ctype.o \ |
2c7d1e30 | 52 | alignedmem.o relocate.o vsprintf.o |
e8f3010f AB |
53 | |
54 | # include the stub's generic dependencies from lib/ when building for ARM/arm64 | |
2e0eb483 | 55 | efi-deps-y := fdt_rw.c fdt_ro.c fdt_wip.c fdt.c fdt_empty_tree.c fdt_sw.c |
e8f3010f AB |
56 | |
57 | $(obj)/lib-%.o: $(srctree)/lib/%.c FORCE | |
58 | $(call if_changed_rule,cc_o_c) | |
59 | ||
2e0eb483 AP |
60 | lib-$(CONFIG_EFI_GENERIC_STUB) += efi-stub.o fdt.o string.o \ |
61 | $(patsubst %.c,lib-%.o,$(efi-deps-y)) | |
f4f75ad5 | 62 | |
81a0bc39 | 63 | lib-$(CONFIG_ARM) += arm32-stub.o |
a6a14469 | 64 | lib-$(CONFIG_ARM64) += arm64-stub.o |
c2d0b470 | 65 | lib-$(CONFIG_X86) += x86-stub.o |
41cd96fa | 66 | CFLAGS_arm32-stub.o := -DTEXT_OFFSET=$(TEXT_OFFSET) |
ac9aff8e | 67 | CFLAGS_arm64-stub.o := -DTEXT_OFFSET=$(TEXT_OFFSET) |
bf457786 | 68 | |
26a92425 AS |
69 | # |
70 | # For x86, bootloaders like systemd-boot or grub-efi do not zero-initialize the | |
71 | # .bss section, so the .bss section of the EFI stub needs to be included in the | |
72 | # .data section of the compressed kernel to ensure initialization. Rename the | |
73 | # .bss section here so it's easy to pick out in the linker script. | |
74 | # | |
75 | STUBCOPY_FLAGS-$(CONFIG_X86) += --rename-section .bss=.bss.efistub,load,alloc | |
76 | STUBCOPY_RELOC-$(CONFIG_X86_32) := R_386_32 | |
77 | STUBCOPY_RELOC-$(CONFIG_X86_64) := R_X86_64_64 | |
78 | ||
79 | # | |
80 | # ARM discards the .data section because it disallows r/w data in the | |
81 | # decompressor. So move our .data to .data.efistub and .bss to .bss.efistub, | |
82 | # which are preserved explicitly by the decompressor linker script. | |
83 | # | |
84 | STUBCOPY_FLAGS-$(CONFIG_ARM) += --rename-section .data=.data.efistub \ | |
85 | --rename-section .bss=.bss.efistub,load,alloc | |
86 | STUBCOPY_RELOC-$(CONFIG_ARM) := R_ARM_ABS | |
87 | ||
ddeeefe2 AB |
88 | # |
89 | # arm64 puts the stub in the kernel proper, which will unnecessarily retain all | |
90 | # code indefinitely unless it is annotated as __init/__initdata/__initconst etc. | |
91 | # So let's apply the __init annotations at the section level, by prefixing | |
92 | # the section names directly. This will ensure that even all the inline string | |
93 | # literals are covered. | |
e8f3010f AB |
94 | # The fact that the stub and the kernel proper are essentially the same binary |
95 | # also means that we need to be extra careful to make sure that the stub does | |
96 | # not rely on any absolute symbol references, considering that the virtual | |
97 | # kernel mapping that the linker uses is not active yet when the stub is | |
98 | # executing. So build all C dependencies of the EFI stub into libstub, and do | |
99 | # a verification pass to see if any absolute relocations exist in any of the | |
100 | # object files. | |
ddeeefe2 | 101 | # |
26a92425 AS |
102 | extra-y := $(lib-y) |
103 | lib-y := $(patsubst %.o,%.stub.o,$(lib-y)) | |
e8f3010f | 104 | |
e8f3010f AB |
105 | STUBCOPY_FLAGS-$(CONFIG_ARM64) += --prefix-alloc-sections=.init \ |
106 | --prefix-symbols=__efistub_ | |
107 | STUBCOPY_RELOC-$(CONFIG_ARM64) := R_AARCH64_ABS | |
108 | ||
109 | $(obj)/%.stub.o: $(obj)/%.o FORCE | |
110 | $(call if_changed,stubcopy) | |
ddeeefe2 | 111 | |
696204fa AB |
112 | # |
113 | # Strip debug sections and some other sections that may legally contain | |
114 | # absolute relocations, so that we can inspect the remaining sections for | |
115 | # such relocations. If none are found, regenerate the output object, but | |
116 | # this time, use objcopy and leave all sections in place. | |
117 | # | |
e8f3010f | 118 | quiet_cmd_stubcopy = STUBCPY $@ |
e8d368ad | 119 | cmd_stubcopy = \ |
02562d0c | 120 | $(STRIP) --strip-debug -o $@ $<; \ |
e8d368ad MY |
121 | if $(OBJDUMP) -r $@ | grep $(STUBCOPY_RELOC-y); then \ |
122 | echo "$@: absolute symbol references not allowed in the EFI stub" >&2; \ | |
123 | /bin/false; \ | |
124 | fi; \ | |
125 | $(OBJCOPY) $(STUBCOPY_FLAGS-y) $< $@ |