boot: Fall back to objcopy if usable for EFI components

In commit b885643b63 ("boot: Always use ELF Tool Chain elfcopy for EFI
builds") I switched to using elfcopy for EFI_OBJCOPY, as llvm-objcopy
lacks support for translating ELF objects to PE32+.  This broke building
on older releases with WITHOUT_ELFTOOLCHAIN_BOOTSTRAP set, as the host
did not provide elfcopy and it was not built as a bootstrap tool.

Now, if we're not bootstrapping ELF Tool Chain we check the output of
`${OBJCOPY} --version`, and will use that ${OBJCOPY} as long as it is
not llvm-objcopy.

Reviewed by:	imp
Sponsored by:	The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D49722
This commit is contained in:
Ed Maste
2025-03-25 09:34:23 -04:00
parent 3620d70511
commit 22921f4b4a
+15
View File
@@ -1,3 +1,5 @@
.include <src.opts.mk>
# Options used when building app-specific efi components
# See conf/kern.mk for the correct set of these
CFLAGS+= -Wformat
@@ -26,7 +28,20 @@ EFI_TARGET= efi-app-x86_64
.else
EFI_TARGET= binary
.endif
# GNU or ELF Tool Chain objcopy is usable for building EFI objects.
# LLVM objcopy is not. Use elfcopy if we've bootstrapped it (and thus
# known to be available) or objcopy is LLVM's.
.if ${MK_ELFTOOLCHAIN_BOOTSTRAP} != "no"
EFI_OBJCOPY?= elfcopy
.else
_v!= ${OBJCOPY} --version
.if ${_v:Mllvm-objcopy*} == ""
EFI_OBJCOPY?= ${OBJCOPY}
.else
EFI_OBJCOPY?= elfcopy
.endif
.endif
# Arbitrarily set the PE/COFF header timestamps to 1 Jan 2024 00:00:00
# for build reproducibility.