Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 19 Mar 2020 22:33:24 +0000 (UTC)
From:      Dimitry Andric <dim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r359155 - in stable/12/stand/i386: . boot2 gptboot gptzfsboot isoboot loader zfsboot
Message-ID:  <202003192233.02JMXOik034466@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dim
Date: Thu Mar 19 22:33:24 2020
New Revision: 359155
URL: https://svnweb.freebsd.org/changeset/base/359155

Log:
  MFC r358643:
  
  Link stand/i386 components using a linker script
  
  LLD 10.0.0 changed the behavior of the -Ttext option, so that using
  -Ttext=0x0 now causes linking of the loaders to fail with:
  
  ld: error: output file too large: 18446744073707016908 bytes
  
  I reported this in https://bugs.llvm.org/show_bug.cgi?id=44715, and
  initially reverted the upstream change in r357259 to work around it.
  
  However, after some discussion with Fangrui Song in the upstream ticket,
  I think we can classify this as an unfortunate interaction between using
  -Ttext=0 in combination with --no-rosegment.  (We added the latter
  in r332090, because btxld does not correctly handle input with more
  than 2 PT_LOAD segments.)
  
  Fangrui suggested to use a linker script instead, and Warner was already
  attempting this in r305353, but had to revert it due to "crypto-using
  boot problems" (not sure what those were :).
  
  This review updates the stand/i386/boot.ldscript to handle more
  sections, inserts some symbols like _edata and such that we use in
  libsa, and also discards any .interp section.
  
  It uses ORG which is defined on the linker command line using
  --defsym ORG=value to set the start of all the sections.
  
  Reviewed by:	imp
  Differential Revision: https://reviews.freebsd.org/D23952

Modified:
  stable/12/stand/i386/Makefile.inc
  stable/12/stand/i386/boot.ldscript
  stable/12/stand/i386/boot2/Makefile
  stable/12/stand/i386/gptboot/Makefile
  stable/12/stand/i386/gptzfsboot/Makefile
  stable/12/stand/i386/isoboot/Makefile
  stable/12/stand/i386/loader/Makefile
  stable/12/stand/i386/zfsboot/Makefile
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/stand/i386/Makefile.inc
==============================================================================
--- stable/12/stand/i386/Makefile.inc	Thu Mar 19 21:38:52 2020	(r359154)
+++ stable/12/stand/i386/Makefile.inc	Thu Mar 19 22:33:24 2020	(r359155)
@@ -22,13 +22,12 @@ CFLAGS+=	-I${BTXLIB}
 
 # compact binary with no padding between text, data, bss
 LDSCRIPT=	${BOOTSRC}/i386/boot.ldscript
-# LDFLAGS_BIN=-e start -Ttext ${ORG} -Wl,-T,${LDSCRIPT},-S,--oformat,binary
-# LD_FLAGS_BIN=-static -T ${LDSCRIPT} --gc-sections
-LDFLAGS_BIN=-e start -Ttext ${ORG} -Wl,-N,-S,--oformat,binary
+LDFLAGS_ORG=	-Wl,--defsym,ORG=${ORG},-T,${LDSCRIPT}
+LDFLAGS_BIN=	-e start ${LDFLAGS_ORG} -Wl,-N,-S,--oformat,binary
 .if ${LINKER_FEATURES:Mbuild-id} != ""
-LDFLAGS_BIN+=-Wl,--build-id=none
+LDFLAGS_BIN+=	-Wl,--build-id=none
 .endif
-LD_FLAGS_BIN=-static -N --gc-sections
+LD_FLAGS_BIN=	-static -N --gc-sections
 
 .if ${MACHINE_CPUARCH} == "amd64"
 DO32=1

Modified: stable/12/stand/i386/boot.ldscript
==============================================================================
--- stable/12/stand/i386/boot.ldscript	Thu Mar 19 21:38:52 2020	(r359154)
+++ stable/12/stand/i386/boot.ldscript	Thu Mar 19 22:33:24 2020	(r359155)
@@ -1,11 +1,17 @@
 /* $FreeBSD$ */
-/* Merge text, data and bss together almost no padding */
+/* Simplified linker script for the boot loaders. */
 OUTPUT_FORMAT("elf32-i386-freebsd")
 OUTPUT_ARCH(i386)
 ENTRY(_start)
 SECTIONS {
-  . = 0x08048000 + SIZEOF_HEADERS;
-  .text : { *(.text) } =0x90909090	/* Pad with nops, if needed */
-  .data : { *(.data) } _edata = .;
-  .bss  : { *(.bss) }  _end = .;
+  . = ORG;
+  .text : { *(.text .text.*) } =0xcccccccc	/* Pad with int3, if needed */
+  .rodata : { *(.rodata .rodata.*) }
+  .got : { *(.got) *(.igot) }
+  .got.plt : { *(.got.plt) *(.igot.plt) }
+  .data : { *(.data .data.*) }
+  _edata = .; PROVIDE (edata = .);
+  .bss : { *(.bss .bss.*) }
+  _end = .; PROVIDE (end = .);
+  /DISCARD/ : { *(.interp) }
 }

Modified: stable/12/stand/i386/boot2/Makefile
==============================================================================
--- stable/12/stand/i386/boot2/Makefile	Thu Mar 19 21:38:52 2020	(r359154)
+++ stable/12/stand/i386/boot2/Makefile	Thu Mar 19 22:33:24 2020	(r359155)
@@ -56,7 +56,7 @@ boot1: boot1.out
 	${OBJCOPY} -S -O binary boot1.out ${.TARGET}
 
 boot1.out: boot1.o
-	${LD} ${LD_FLAGS} -e start -Ttext ${ORG1} -o ${.TARGET} boot1.o
+	${LD} ${LD_FLAGS} -e start --defsym ORG=${ORG1} -T ${LDSCRIPT} -o ${.TARGET} boot1.o
 
 CLEANFILES+=	boot2 boot2.ld boot2.ldr boot2.bin boot2.out boot2.o \
 		boot2.h sio.o
@@ -84,7 +84,7 @@ CFLAGS.ashldi3.c=	-Wno-missing-prototypes -Wno-missing
 CLEANFILES+=	ashldi3.o
 
 boot2.out: ${BTXCRT} boot2.o sio.o ashldi3.o
-	${LD} ${LD_FLAGS} -Ttext ${ORG2} -o ${.TARGET} ${.ALLSRC}
+	${LD} ${LD_FLAGS} --defsym ORG=${ORG2} -T ${LDSCRIPT} -o ${.TARGET} ${.ALLSRC}
 
 SRCS=	boot2.c boot2.h
 

Modified: stable/12/stand/i386/gptboot/Makefile
==============================================================================
--- stable/12/stand/i386/gptboot/Makefile	Thu Mar 19 21:38:52 2020	(r359154)
+++ stable/12/stand/i386/gptboot/Makefile	Thu Mar 19 22:33:24 2020	(r359155)
@@ -51,7 +51,7 @@ gptldr.bin: gptldr.out
 	${OBJCOPY} -S -O binary gptldr.out ${.TARGET}
 
 gptldr.out: gptldr.o
-	${LD} ${LD_FLAGS} -e start -Ttext ${ORG1} -o ${.TARGET} gptldr.o
+	${LD} ${LD_FLAGS} -e start --defsym ORG=${ORG1} -T ${LDSCRIPT} -o ${.TARGET} gptldr.o
 
 CLEANFILES+=	gptboot.bin gptboot.out gptboot.o sio.o crc32.o drv.o \
 		cons.o ${OPENCRYPTO_XTS}
@@ -60,7 +60,7 @@ gptboot.bin: gptboot.out
 	${OBJCOPY} -S -O binary gptboot.out ${.TARGET}
 
 gptboot.out: ${BTXCRT} gptboot.o sio.o crc32.o drv.o cons.o ${OPENCRYPTO_XTS}
-	${LD} ${LD_FLAGS} -Ttext ${ORG2} -o ${.TARGET} ${.ALLSRC} ${LIBSA32}
+	${LD} ${LD_FLAGS} --defsym ORG=${ORG2} -T ${LDSCRIPT} -o ${.TARGET} ${.ALLSRC} ${LIBSA32}
 
 .include <bsd.prog.mk>
 

Modified: stable/12/stand/i386/gptzfsboot/Makefile
==============================================================================
--- stable/12/stand/i386/gptzfsboot/Makefile	Thu Mar 19 21:38:52 2020	(r359154)
+++ stable/12/stand/i386/gptzfsboot/Makefile	Thu Mar 19 22:33:24 2020	(r359155)
@@ -57,7 +57,7 @@ gptldr.bin: gptldr.out
 	${OBJCOPY} -S -O binary gptldr.out ${.TARGET}
 
 gptldr.out: gptldr.o
-	${LD} ${LD_FLAGS} -e start -Ttext ${ORG1} -o ${.TARGET} gptldr.o
+	${LD} ${LD_FLAGS} -e start --defsym ORG=${ORG1} -T ${LDSCRIPT} -o ${.TARGET} gptldr.o
 
 CLEANFILES+=	gptzfsboot.bin gptzfsboot.out zfsboot.o sio.o cons.o \
 		drv.o gpt.o ${OPENCRYPTO_XTS}
@@ -67,7 +67,7 @@ gptzfsboot.bin: gptzfsboot.out
 
 gptzfsboot.out: ${BTXCRT} zfsboot.o sio.o gpt.o drv.o cons.o \
 	${OPENCRYPTO_XTS}
-	${LD} ${LD_FLAGS} -Ttext ${ORG2} -o ${.TARGET} ${.ALLSRC} ${LIBSA32}
+	${LD} ${LD_FLAGS} --defsym ORG=${ORG2} -T ${LDSCRIPT} -o ${.TARGET} ${.ALLSRC} ${LIBSA32}
 
 zfsboot.o: ${ZFSSRC}/zfsimpl.c
 

Modified: stable/12/stand/i386/isoboot/Makefile
==============================================================================
--- stable/12/stand/i386/isoboot/Makefile	Thu Mar 19 21:38:52 2020	(r359154)
+++ stable/12/stand/i386/isoboot/Makefile	Thu Mar 19 22:33:24 2020	(r359155)
@@ -53,7 +53,7 @@ gptldr.bin: gptldr.out
 	${OBJCOPY} -S -O binary gptldr.out ${.TARGET}
 
 gptldr.out: gptldr.o
-	${LD} ${LD_FLAGS} -e start -Ttext ${ORG1} -o ${.TARGET} gptldr.o
+	${LD} ${LD_FLAGS} -e start --defsym ORG=${ORG1} -T ${LDSCRIPT} -o ${.TARGET} gptldr.o
 
 CLEANFILES+=	isoboot.bin isoboot.out isoboot.o sio.o crc32.o drv.o \
 		cons.o ${OPENCRYPTO_XTS}
@@ -62,6 +62,6 @@ isoboot.bin: isoboot.out
 	${OBJCOPY} -S -O binary isoboot.out ${.TARGET}
 
 isoboot.out: ${BTXCRT} isoboot.o sio.o crc32.o drv.o cons.o ${OPENCRYPTO_XTS}
-	${LD} ${LD_FLAGS} -Ttext ${ORG2} -o ${.TARGET} ${.ALLSRC} ${LIBSA32}
+	${LD} ${LD_FLAGS} --defsym ORG=${ORG2} -T ${LDSCRIPT} -o ${.TARGET} ${.ALLSRC} ${LIBSA32}
 
 .include <bsd.prog.mk>

Modified: stable/12/stand/i386/loader/Makefile
==============================================================================
--- stable/12/stand/i386/loader/Makefile	Thu Mar 19 21:38:52 2020	(r359154)
+++ stable/12/stand/i386/loader/Makefile	Thu Mar 19 22:33:24 2020	(r359155)
@@ -46,8 +46,10 @@ HELP_FILES=	${.CURDIR}/help.i386
 
 CLEANFILES+=	${LOADER} ${LOADER}.bin
 
+ORG=		0x0
+
 CFLAGS+=	-Wall
-LDFLAGS+=	-static -Ttext 0x0 -Wl,--gc-sections
+LDFLAGS+=	-static ${LDFLAGS_ORG} -Wl,--gc-sections
 
 # i386 standalone support library
 LIBI386=	${BOOTOBJ}/i386/libi386/libi386.a

Modified: stable/12/stand/i386/zfsboot/Makefile
==============================================================================
--- stable/12/stand/i386/zfsboot/Makefile	Thu Mar 19 21:38:52 2020	(r359154)
+++ stable/12/stand/i386/zfsboot/Makefile	Thu Mar 19 22:33:24 2020	(r359155)
@@ -49,7 +49,7 @@ zfsboot1: zfsldr.out
 	${OBJCOPY} -S -O binary zfsldr.out ${.TARGET}
 
 zfsldr.out: zfsldr.o
-	${LD} ${LD_FLAGS} -e start -Ttext ${ORG1} -o ${.TARGET} zfsldr.o
+	${LD} ${LD_FLAGS} -e start --defsym ORG=${ORG1} -T ${LDSCRIPT} -o ${.TARGET} zfsldr.o
 
 CLEANFILES+=	zfsboot2 zfsboot.ld zfsboot.ldr zfsboot.bin zfsboot.out \
 		zfsboot.o zfsboot.s zfsboot.s.tmp sio.o cons.o drv.o
@@ -75,7 +75,7 @@ zfsboot.bin: zfsboot.out
 	${OBJCOPY} -S -O binary zfsboot.out ${.TARGET}
 
 zfsboot.out: ${BTXCRT} zfsboot.o sio.o drv.o cons.o
-	${LD} ${LD_FLAGS} -Ttext ${ORG2} -o ${.TARGET} ${.ALLSRC} ${LIBSA32}
+	${LD} ${LD_FLAGS} --defsym ORG=${ORG2} -T ${LDSCRIPT} -o ${.TARGET} ${.ALLSRC} ${LIBSA32}
 
 SRCS=	zfsboot.c
 



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