efi/arm: fix absolute relocation detection for older toolchains
PATCH 1/1 efi/arm: fix absolute relocation detection for older toolchains
When building the ARM kernel with CONFIG_EFI=y, the following build error may occur when using a less recent version of binutils (2.23 or older):
STUBCPY drivers/firmware/efi/libstub/lib-sort.stub.o
00000000 R_ARM_ABS32 sort
00000004 R_ARM_ABS32 __ksymtab_strings
drivers/firmware/efi/libstub/lib-sort.stub.o: absolute symbol references not allowed in the EFI stub
(and when building with debug symbols, the list above is much longer, and contains all the internal references between the .debug sections and the actual code)
This issue is caused by the fact that objcopy v2.23 or earlier does not support wildcards in its -R and -j options, which means the following line from the Makefile:
STUBCOPY_FLAGS-y := -R .debug* -R *ksymtab* -R *kcrctab*
fails to take effect, leaving harmless absolute relocations in the binary that are indistinguishable from relocations that may cause crashes at runtime due to the fact that these relocations are resolved at link time using the virtual address of the kernel, which is always different from the address at which the EFI firmware loads and invokes the stub.
So, as a workaround, disable debug symbols explicitly when building the stub for ARM, and strip the ksymtab and kcrctab symbols for the only exported symbol we currently reuse in the stub, which is 'sort'.
---
This is a workaround for now. We can revisit this when a need arises to copy more kernel code into the stub, by which time we could put in a more elaborate fix, or decide to no longer care about 'older' versions of objcopy.
Since this fixes an ARM specific issue and only affects ARM specific Makefile variables, I am happy for this to go on top of the arm-soc patch that enables CONFIG_EFI for ARM's multi_v7_defconfig (queued for v4.9), given that we have no other changes queued in linux-efi that should conflict with this patch.
Matt, any concerns?
drivers/firmware/efi/libstub/Makefile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/firmware/efi/libstub/Makefile +3 -2
@@ -11,7 +11,7 @@ cflags-$(CONFIG_X86) += -m$(BITS) -D__KERNEL__ $(LINUX_INCLUDE) -O2 \ -mno-mmx -mno-sse cflags-$(CONFIG_ARM64) := $(subst -pg,,$(KBUILD_CFLAGS)) -cflags-$(CONFIG_ARM) := $(subst -pg,,$(KBUILD_CFLAGS)) \ +cflags-$(CONFIG_ARM) := $(subst -pg,,$(KBUILD_CFLAGS)) -g0 \ -fno-builtin -fpic -mno-single-pic-base cflags-$(CONFIG_EFI_ARMSTUB) += -I$(srctree)/scripts/dtc/libfdt
@@ -79,5 +79,6 @@ quiet_cmd_stubcopy = STUBCPY $@ # 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 +STUBCOPY_FLAGS-$(CONFIG_ARM) += --rename-section .data=.data.efistub \ + -R ___ksymtab+sort -R ___kcrctab+sort STUBCOPY_RELOC-$(CONFIG_ARM) := R_ARM_ABS
Signature · 1 line
2.7.4
PATCH 1/1 efi/arm: fix absolute relocation detection for older toolchains
Quoted 11 lines · Ard Biesheuvel
This is a workaround for now. We can revisit this when a need arises to copy more kernel code into the stub, by which time we could put in a more elaborate fix, or decide to no longer care about 'older' versions of objcopy.
Since this fixes an ARM specific issue and only affects ARM specific
Makefilevariables, I am happy for this to go on top of the arm-soc patch that enablesCONFIG_EFIfor ARM'smulti_v7_defconfig(queued for v4.9), given that we have no other changes queued in linux-efi that should conflict with this patch.Matt, any concerns?
Not with the patch, but could we clarify the user-visible effects of not applying it? Are the absolute relocations harmless, or will they lead to crashes?
PATCH 1/1 efi/arm: fix absolute relocation detection for older toolchains
Quoted 11 lines · Matt Fleming
Quoted 10 lines · Ard Biesheuvel
This is a workaround for now. We can revisit this when a need arises to copy more kernel code into the stub, by which time we could put in a more elaborate fix, or decide to no longer care about 'older' versions of objcopy.
Since this fixes an ARM specific issue and only affects ARM specific
Makefilevariables, I am happy for this to go on top of the arm-soc patch that enablesCONFIG_EFIfor ARM'smulti_v7_defconfig(queued for v4.9), given that we have no other changes queued in linux-efi that should conflict with this patch.
Quoted 5 lines
Quoted 1 line
Matt, any concerns?
Not with the patch, but could we clarify the user-visible effects of not applying it? Are the absolute relocations harmless, or will they lead to crashes?
These relocations are harmless, since the debug ones are only interpreted by the debugger, and the ones generated by EXPORT_SYMBOL(sort) will never be referenced, since the symbols they contain are either renamed to __efistub_xxx (arm64), or they are not part of the kernel proper (arm)
So both cases are false positives, but the diagnostic is important, and so breaking the build is appropriate for any other absolute relocation that may appear.
The effect of the patch is not that the diagnostic is ignored, but that these relocations are not generated in the first place (-g0) or removed explicitly (ksymtab/krcrctab+sort) rather than via a wildcard. So other than not breaking the build, this patch should have no user observeable differences.
Signature · 1 line
Ard.
PATCH 1/1 efi/arm: fix absolute relocation detection for older toolchains
Quoted 11 lines · Ard Biesheuvel
These relocations are harmless, since the debug ones are only interpreted by the debugger, and the ones generated by
EXPORT_SYMBOL(sort)will never be referenced, since the symbols they contain are either renamed to__efistub_xxx(arm64), or they are not part of the kernel proper (arm)So both cases are false positives, but the diagnostic is important, and so breaking the build is appropriate for any other absolute relocation that may appear.
Quoted 5 lines
The effect of the patch is not that the diagnostic is ignored, but that these relocations are not generated in the first place (-g0) or removed explicitly (ksymtab/krcrctab+sort) rather than via a wildcard. So other than not breaking the build, this patch should have no user observeable differences.
Thanks Ard, sounds reasonable. Feel free to take this through whichever tree you think is best.
PATCH 1/1 efi/arm: fix absolute relocation detection for older toolchains
Quoted 18 lines · Matt Fleming
Quoted 11 lines · Ard Biesheuvel
These relocations are harmless, since the debug ones are only interpreted by the debugger, and the ones generated by
EXPORT_SYMBOL(sort)will never be referenced, since the symbols they contain are either renamed to__efistub_xxx(arm64), or they are not part of the kernel proper (arm)So both cases are false positives, but the diagnostic is important, and so breaking the build is appropriate for any other absolute relocation that may appear.
Quoted 5 lines
The effect of the patch is not that the diagnostic is ignored, but that these relocations are not generated in the first place (-g0) or removed explicitly (ksymtab/krcrctab+sort) rather than via a wildcard. So other than not breaking the build, this patch should have no user observeable differences.
Quoted 4 lines
Thanks Ard, sounds reasonable. Feel free to take this through whichever tree you think is best.
Reviewed-by Matt Fleming <[email protected]>
Thanks Matt.
Arnd: could you take this on top of the patch that adds CONFIG_EFI to multi_v7_defconfig? That would minimize the breakage, I think.
PATCH 1/1 efi/arm: fix absolute relocation detection for older toolchains
Quoted 22 lines · Ard Biesheuvel
Quoted 21 lines · Matt Fleming
Quoted 11 lines · Ard Biesheuvel
These relocations are harmless, since the debug ones are only interpreted by the debugger, and the ones generated by
EXPORT_SYMBOL(sort)will never be referenced, since the symbols they contain are either renamed to__efistub_xxx(arm64), or they are not part of the kernel proper (arm)So both cases are false positives, but the diagnostic is important, and so breaking the build is appropriate for any other absolute relocation that may appear.
Quoted 5 lines
The effect of the patch is not that the diagnostic is ignored, but that these relocations are not generated in the first place (-g0) or removed explicitly (ksymtab/krcrctab+sort) rather than via a wildcard. So other than not breaking the build, this patch should have no user observeable differences.
Thanks Ard, sounds reasonable. Feel free to take this through whichever tree you think is best.
Quoted 6 lines
Quoted 1 line
Reviewed-by Matt Fleming <[email protected]>Thanks Matt.
Arnd: could you take this on top of the patch that adds
CONFIG_EFItomulti_v7_defconfig? That would minimize the breakage, I think.
Can someone pick up this fix? -next has been broken for me since 20th Sept :-(
Cheers
Jon
Signature · 1 line
nvpublic
PATCH 1/1 efi/arm: fix absolute relocation detection for older toolchains
In reply to Ard BiesheuvelQuoted 26 lines · Ard Biesheuvel
When building the ARM kernel with
CONFIG_EFI=y, the following build error may occur when using a less recent version of binutils (2.23 or older):STUBCPY
drivers/firmware/efi/libstub/lib-sort.stub.o
00000000R_ARM_ABS32sort
00000004R_ARM_ABS32__ksymtab_strings
drivers/firmware/efi/libstub/lib-sort.stub.o: absolute symbol references not allowed in the EFI stub(and when building with debug symbols, the list above is much longer, and contains all the internal references between the .debug sections and the actual code)
This issue is caused by the fact that objcopy v2.23 or earlier does not support wildcards in its -R and -j options, which means the following line from the
Makefile:STUBCOPY_FLAGS-y := -R .debug* -R *ksymtab* -R *kcrctab*
fails to take effect, leaving harmless absolute relocations in the binary that are indistinguishable from relocations that may cause crashes at runtime due to the fact that these relocations are resolved at link time using the virtual address of the kernel, which is always different from the address at which the EFI firmware loads and invokes the stub.
Quoted 5 lines
So, as a workaround, disable debug symbols explicitly when building the stub for ARM, and strip the ksymtab and kcrctab symbols for the only exported symbol we currently reuse in the stub, which is 'sort'.
Signed-off-by Ard Biesheuvel <[email protected]>
Thanks fixes the issues I was seeing. So ...
Cheers
Jon
Signature · 1 line
nvpublic