git: b885643b63e4 - main - boot: Always use ELF Tool Chain elfcopy for EFI builds

From: Ed Maste <emaste_at_FreeBSD.org>
Date: Sun, 23 Mar 2025 22:17:36 UTC
The branch main has been updated by emaste:

URL: https://cgit.FreeBSD.org/src/commit/?id=b885643b63e4df51cc6c74c4ddd4d0b640075678

commit b885643b63e4df51cc6c74c4ddd4d0b640075678
Author:     Ed Maste <emaste@FreeBSD.org>
AuthorDate: 2025-03-14 16:42:15 +0000
Commit:     Ed Maste <emaste@FreeBSD.org>
CommitDate: 2025-03-23 22:17:03 +0000

    boot: Always use ELF Tool Chain elfcopy for EFI builds
    
    We now use llvm-objcopy by default (as of commit 1cae7121c667), but it
    does not support efi-app-x86_64 and similar ouptut formats (for more
    detail see LLVM issue 108609[1]).
    
    Go back to installing ELF Tool Chain's version of objcopy as elfcopy
    (the standard upstream name) and use it for EFI builds.
    
    [1] https://github.com/llvm/llvm-project/issues/108609).
    
    PR:             280771
    Reviewed by:    andrew
    Sponsored by:   The FreeBSD Foundation
    Differential Revision: https://reviews.freebsd.org/D49362
---
 ObsoleteFiles.inc                        |  3 ---
 stand/efi/Makefile.inc                   |  1 +
 stand/efi/boot1/Makefile                 |  2 +-
 stand/efi/loader/Makefile                |  2 +-
 tools/build/mk/OptionalObsoleteFiles.inc |  2 ++
 usr.bin/Makefile                         |  3 ++-
 usr.bin/objcopy/Makefile                 | 14 +++++++++++---
 7 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc
index f56ad74294f9..850133db608a 100644
--- a/ObsoleteFiles.inc
+++ b/ObsoleteFiles.inc
@@ -13587,9 +13587,6 @@ OLD_FILES+=usr/share/man/man1/rlog.1.gz
 OLD_FILES+=usr/share/man/man5/rcsfile.5.gz
 # 20161010: remove link to removed m_getclr(9) macro
 OLD_FILES+=usr/share/man/man9/m_getclr.9.gz
-# 20161003: MK_ELFCOPY_AS_OBJCOPY option retired
-OLD_FILES+=usr/bin/elfcopy
-OLD_FILES+=usr/share/man/man1/elfcopy.1.gz
 # 20160906: libkqueue tests moved to /usr/tests/sys/kqueue/libkqueue
 OLD_FILES+=usr/tests/sys/kqueue/kqtest
 OLD_FILES+=usr/tests/sys/kqueue/kqueue_test
diff --git a/stand/efi/Makefile.inc b/stand/efi/Makefile.inc
index b5bd341d1b78..f91ac9102ca8 100644
--- a/stand/efi/Makefile.inc
+++ b/stand/efi/Makefile.inc
@@ -26,6 +26,7 @@ EFI_TARGET=	efi-app-x86_64
 .else
 EFI_TARGET=	binary
 .endif
+EFI_OBJCOPY?=	elfcopy
 
 # Arbitrarily set the PE/COFF header timestamps to 1 Jan 2024 00:00:00
 # for build reproducibility.
diff --git a/stand/efi/boot1/Makefile b/stand/efi/boot1/Makefile
index 8641ecf457ab..e2966e813504 100644
--- a/stand/efi/boot1/Makefile
+++ b/stand/efi/boot1/Makefile
@@ -96,7 +96,7 @@ ${BOOT1}.efi: ${PROG}
 		exit 1; \
 	fi
 	SOURCE_DATE_EPOCH=${SOURCE_DATE_EPOCH} \
-	${OBJCOPY} -j .peheader -j .text -j .sdata -j .data \
+	${EFI_OBJCOPY} -j .peheader -j .text -j .sdata -j .data \
 		-j .dynamic -j .dynsym -j .rel.dyn \
 		-j .rela.dyn -j .reloc -j .eh_frame \
 		--output-target=${EFI_TARGET} ${.ALLSRC} ${.TARGET}
diff --git a/stand/efi/loader/Makefile b/stand/efi/loader/Makefile
index e9d29e5a219e..2dae035f04a8 100644
--- a/stand/efi/loader/Makefile
+++ b/stand/efi/loader/Makefile
@@ -128,7 +128,7 @@ ${LOADER}.efi: ${PROG}
 		exit 1; \
 	fi
 	SOURCE_DATE_EPOCH=${SOURCE_DATE_EPOCH} \
-	${OBJCOPY} -j .peheader -j .text -j .sdata -j .data \
+	${EFI_OBJCOPY} -j .peheader -j .text -j .sdata -j .data \
 		-j .dynamic -j .dynsym -j .rel.dyn \
 		-j .rela.dyn -j .reloc -j .eh_frame -j set_Xcommand_set \
 		-j set_X${LOADER_INTERP}_compile_set \
diff --git a/tools/build/mk/OptionalObsoleteFiles.inc b/tools/build/mk/OptionalObsoleteFiles.inc
index 864057692566..b25f551d069b 100644
--- a/tools/build/mk/OptionalObsoleteFiles.inc
+++ b/tools/build/mk/OptionalObsoleteFiles.inc
@@ -8125,6 +8125,7 @@ OLD_FILES+=usr/bin/cc
 OLD_FILES+=usr/bin/c88
 OLD_FILES+=usr/bin/c++
 OLD_FILES+=usr/bin/c++filt
+OLD_FILES+=usr/bin/elfcopy
 OLD_FILES+=usr/bin/ld
 OLD_FILES+=usr/bin/ld.bfd
 OLD_FILES+=usr/bin/nm
@@ -8135,6 +8136,7 @@ OLD_FILES+=usr/bin/strip
 OLD_FILES+=usr/bin/yacc
 OLD_FILES+=usr/share/man/man1/addr2line.1.gz
 OLD_FILES+=usr/share/man/man1/c++filt.1.gz
+OLD_FILES+=usr/share/man/man1/elfcopy.1.gz
 OLD_FILES+=usr/share/man/man1/nm.1.gz
 OLD_FILES+=usr/share/man/man1/readelf.1.gz
 OLD_FILES+=usr/share/man/man1/size.1.gz
diff --git a/usr.bin/Makefile b/usr.bin/Makefile
index 15fcdeb479f7..b9e4d6c1153a 100644
--- a/usr.bin/Makefile
+++ b/usr.bin/Makefile
@@ -247,7 +247,6 @@ SUBDIR.${MK_TFTP}+=	tftp
 SUBDIR.${MK_TOOLCHAIN}+=	addr2line
 SUBDIR.${MK_TOOLCHAIN}+=	ar
 SUBDIR.${MK_TOOLCHAIN}+=	nm
-SUBDIR.${MK_TOOLCHAIN}+=	objcopy
 SUBDIR.${MK_TOOLCHAIN}+=	readelf
 SUBDIR.${MK_TOOLCHAIN}+=	size
 .endif
@@ -270,6 +269,8 @@ SUBDIR.${MK_TOOLCHAIN}+=	indent
 SUBDIR.${MK_TOOLCHAIN}+=	lex
 SUBDIR.${MK_TOOLCHAIN}+=	lorder
 SUBDIR.${MK_TOOLCHAIN}+=	mkstr
+# ELF Tool Chain elfcopy required for EFI objects (PR280771)
+SUBDIR.${MK_TOOLCHAIN}+=	objcopy
 SUBDIR.${MK_TOOLCHAIN}+=	rpcgen
 SUBDIR.${MK_TOOLCHAIN}+=	unifdef
 SUBDIR.${MK_TOOLCHAIN}+=	xstr
diff --git a/usr.bin/objcopy/Makefile b/usr.bin/objcopy/Makefile
index 101c84cc5206..2f3386d95ebe 100644
--- a/usr.bin/objcopy/Makefile
+++ b/usr.bin/objcopy/Makefile
@@ -7,12 +7,22 @@ ELFCOPYDIR=	${ELFTCDIR}/elfcopy
 
 .PATH: ${ELFCOPYDIR}
 
-PROG=	objcopy
+PROG=	elfcopy
+MAN=	elfcopy.1
+
+.if ${MK_LLVM_BINUTILS} == "no"
+
+LINKS+=	${BINDIR}/${PROG} ${BINDIR}/objcopy
+LINKS+=	${BINDIR}/${PROG} ${BINDIR}/strip
+MAN+=	objcopy.1 strip.1
+
 objcopy.1: elfcopy.1
 	sed -e 's/\.Dt ELFCOPY 1/.Dt OBJCOPY 1/' \
 	    -e '/\.Nm elfcopy ,/d' < ${.ALLSRC} > ${.TARGET}
 CLEANFILES+= objcopy.1
 
+.endif
+
 SRCS=	archive.c ascii.c binary.c main.c pe.c sections.c segments.c symbols.c
 
 WARNS?=	5
@@ -22,9 +32,7 @@ LIBADD=	archive elftc elf pe
 CFLAGS+=-I${ELFTCDIR}/libelftc -I${ELFTCDIR}/libpe -I${ELFTCDIR}/common
 CFLAGS+=-DWITH_PE=1
 
-MAN=	${PROG}.1 strip.1
 
-LINKS=	${BINDIR}/${PROG} ${BINDIR}/strip
 
 # This same hack is in lib/libelf/Makefile and usr.bin/readelf/Makefile
 # We need to link against the correct version of these files. One