| From foo@baz Wed Nov 21 18:50:25 CET 2018 |
| From: Ard Biesheuvel <ard.biesheuvel@linaro.org> |
| Date: Tue, 31 Jan 2017 13:21:42 +0000 |
| Subject: efi/libstub: Preserve .debug sections after absolute relocation check |
| |
| From: Ard Biesheuvel <ard.biesheuvel@linaro.org> |
| |
| commit 696204faa6e8a318320ebb49d9fa69bc8275644d upstream. |
| |
| The build commands for the ARM and arm64 EFI stubs strip the .debug |
| sections and other sections that may legally contain absolute relocations, |
| in order to inspect the remaining sections for the presence of such |
| relocations. |
| |
| This leaves us without debugging symbols in the stub for no good reason, |
| considering that these sections are omitted from the kernel binary anyway, |
| and that these relocations are thus only consumed by users of the ELF |
| binary, such as debuggers. |
| |
| So move to 'strip' for performing the relocation check, and if it succeeds, |
| invoke objcopy as before, but leaving the .debug sections in place. Note |
| that these sections may refer to ksymtab/kcrctab contents, so leave those |
| in place as well. |
| |
| Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> |
| Cc: Linus Torvalds <torvalds@linux-foundation.org> |
| Cc: Matt Fleming <matt@codeblueprint.co.uk> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Cc: linux-efi@vger.kernel.org |
| Link: http://lkml.kernel.org/r/1485868902-20401-11-git-send-email-ard.biesheuvel@linaro.org |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| Signed-off-by: Nick Desaulniers <ndesaulniers@google.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/firmware/efi/libstub/Makefile | 24 ++++++++++++++++-------- |
| 1 file changed, 16 insertions(+), 8 deletions(-) |
| |
| --- a/drivers/firmware/efi/libstub/Makefile |
| +++ b/drivers/firmware/efi/libstub/Makefile |
| @@ -11,7 +11,7 @@ cflags-$(CONFIG_X86) += -m$(BITS) -D__K |
| -mno-mmx -mno-sse |
| |
| cflags-$(CONFIG_ARM64) := $(subst -pg,,$(KBUILD_CFLAGS)) |
| -cflags-$(CONFIG_ARM) := $(subst -pg,,$(KBUILD_CFLAGS)) -g0 \ |
| +cflags-$(CONFIG_ARM) := $(subst -pg,,$(KBUILD_CFLAGS)) \ |
| -fno-builtin -fpic -mno-single-pic-base |
| |
| cflags-$(CONFIG_EFI_ARMSTUB) += -I$(srctree)/scripts/dtc/libfdt |
| @@ -60,7 +60,7 @@ CFLAGS_arm64-stub.o := -DTEXT_OFFSET=$ |
| extra-$(CONFIG_EFI_ARMSTUB) := $(lib-y) |
| lib-$(CONFIG_EFI_ARMSTUB) := $(patsubst %.o,%.stub.o,$(lib-y)) |
| |
| -STUBCOPY_FLAGS-y := -R .debug* -R *ksymtab* -R *kcrctab* |
| +STUBCOPY_RM-y := -R *ksymtab* -R *kcrctab* |
| STUBCOPY_FLAGS-$(CONFIG_ARM64) += --prefix-alloc-sections=.init \ |
| --prefix-symbols=__efistub_ |
| STUBCOPY_RELOC-$(CONFIG_ARM64) := R_AARCH64_ABS |
| @@ -68,17 +68,25 @@ STUBCOPY_RELOC-$(CONFIG_ARM64) := R_AARC |
| $(obj)/%.stub.o: $(obj)/%.o FORCE |
| $(call if_changed,stubcopy) |
| |
| +# |
| +# Strip debug sections and some other sections that may legally contain |
| +# absolute relocations, so that we can inspect the remaining sections for |
| +# such relocations. If none are found, regenerate the output object, but |
| +# this time, use objcopy and leave all sections in place. |
| +# |
| quiet_cmd_stubcopy = STUBCPY $@ |
| - cmd_stubcopy = if $(OBJCOPY) $(STUBCOPY_FLAGS-y) $< $@; then \ |
| - $(OBJDUMP) -r $@ | grep $(STUBCOPY_RELOC-y) \ |
| - && (echo >&2 "$@: absolute symbol references not allowed in the EFI stub"; \ |
| - rm -f $@; /bin/false); else /bin/false; fi |
| + cmd_stubcopy = if $(STRIP) --strip-debug $(STUBCOPY_RM-y) -o $@ $<; \ |
| + then if $(OBJDUMP) -r $@ | grep $(STUBCOPY_RELOC-y); \ |
| + then (echo >&2 "$@: absolute symbol references not allowed in the EFI stub"; \ |
| + rm -f $@; /bin/false); \ |
| + else $(OBJCOPY) $(STUBCOPY_FLAGS-y) $< $@; fi \ |
| + else /bin/false; fi |
| |
| # |
| # ARM discards the .data section because it disallows r/w data in the |
| # decompressor. So move our .data to .data.efistub, which is preserved |
| # explicitly by the decompressor linker script. |
| # |
| -STUBCOPY_FLAGS-$(CONFIG_ARM) += --rename-section .data=.data.efistub \ |
| - -R ___ksymtab+sort -R ___kcrctab+sort |
| +STUBCOPY_FLAGS-$(CONFIG_ARM) += --rename-section .data=.data.efistub |
| +STUBCOPY_RM-$(CONFIG_ARM) += -R ___ksymtab+sort -R ___kcrctab+sort |
| STUBCOPY_RELOC-$(CONFIG_ARM) := R_ARM_ABS |