Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 30 Jul 2021 23:34:14 GMT
From:      Warner Losh <imp@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 631cf89fd4c8 - stable/13 - boot: fix OBJS to not include BTX's crt0.o
Message-ID:  <202107302334.16UNYEFW084171@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by imp:

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

commit 631cf89fd4c869d3688a63402199e0500b1a65a8
Author:     Warner Losh <imp@FreeBSD.org>
AuthorDate: 2021-05-06 19:05:09 +0000
Commit:     Warner Losh <imp@FreeBSD.org>
CommitDate: 2021-07-30 23:00:17 +0000

    boot: fix OBJS to not include BTX's crt0.o
    
    According to comments in the Makefile, to make pxeboot work we need to
    have crt0.o first. This is needed because the simplified loader in
    pxeboot assumes that the startup code is at offset 0 in this binary. In
    normal booting, the start address can be obtained from headers of the
    binary, but since pxeboot encodes this as a pure binary, it has no way
    of knowing where that is and assumes 0. Added comments to that effect
    in the Makefile.
    
    We've done this by adding it to OBJS before all the other .o's are
    added. However, there's a problem. This also adds it to the CLEANFILES
    variable, which causes it to be removed from multiple places. The
    dependencies may also cause it to be re-built at a time that's after
    boot2 is built. This causes installs to fail because at install time
    boot2 is considered to be out of date and the programs to rebuild it are
    no longer in the path.
    
    Cope with this problem by just adding it to LDFLAGS instead.
    
    Glanced at by:          kevans ("I thought that went in ages ago")
    Sponsored by:           Netflix
    Differential Revision:  https://reviews.freebsd.org/D28876
    
    (cherry picked from commit e713d3a013882893fceb84dd14569052271497a9)
---
 stand/i386/loader/Makefile | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/stand/i386/loader/Makefile b/stand/i386/loader/Makefile
index ad95948ec50a..dcae7bd67a14 100644
--- a/stand/i386/loader/Makefile
+++ b/stand/i386/loader/Makefile
@@ -89,8 +89,18 @@ LINKS+=		${BINDIR}/${LOADER} ${BINDIR}/loader
 FILES+=	${LOADER}
 FILESMODE_${LOADER}= ${BINMODE} -b
 
-# XXX crt0.o needs to be first for pxeboot(8) to work
-OBJS=	${BTXCRT}
+# Note: crt0.o needs to be first for pxeboot(8) to work. It assumes that the
+# startup code is located at the start of the loader and will jump
+# there. Although btx is more flexible than this, the emulated boot2 environment
+# that pxeloader provides has none of that flexibility because it lacks access
+# to the a.out/elf headers and assumes an entry point of 0.
+#
+# We must add it to the LDFLAGS instead of the OBJS becauce the former won't try
+# to clean it. When it is in OBJS, this cleaning can lead to races where
+# btxcrt.o is rebuilt, but boot2 isn't, leading to errors at installation time.
+# LDFLAGS does not have this baggage and will be included first in the list of
+# files.
+LDFLAGS+=	${BTXCRT}
 
 DPADD=	${LDR_INTERP32} ${LIBFIREWIRE} ${LIBI386} ${LIBSA32}
 LDADD=	${LDR_INTERP32} ${LIBFIREWIRE} ${LIBI386} ${LIBSA32}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202107302334.16UNYEFW084171>