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 MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D23952
This commit is contained in:
parent
89839cad79
commit
a2037dba7e
@ -22,13 +22,12 @@ CFLAGS+= -I${BTXLIB}
|
|||||||
|
|
||||||
# compact binary with no padding between text, data, bss
|
# compact binary with no padding between text, data, bss
|
||||||
LDSCRIPT= ${BOOTSRC}/i386/boot.ldscript
|
LDSCRIPT= ${BOOTSRC}/i386/boot.ldscript
|
||||||
# LDFLAGS_BIN=-e start -Ttext ${ORG} -Wl,-T,${LDSCRIPT},-S,--oformat,binary
|
LDFLAGS_ORG= -Wl,--defsym,ORG=${ORG},-T,${LDSCRIPT}
|
||||||
# LD_FLAGS_BIN=-static -T ${LDSCRIPT} --gc-sections
|
LDFLAGS_BIN= -e start ${LDFLAGS_ORG} -Wl,-N,-S,--oformat,binary
|
||||||
LDFLAGS_BIN=-e start -Ttext ${ORG} -Wl,-N,-S,--oformat,binary
|
|
||||||
.if ${LINKER_FEATURES:Mbuild-id} != ""
|
.if ${LINKER_FEATURES:Mbuild-id} != ""
|
||||||
LDFLAGS_BIN+=-Wl,--build-id=none
|
LDFLAGS_BIN+= -Wl,--build-id=none
|
||||||
.endif
|
.endif
|
||||||
LD_FLAGS_BIN=-static -N --gc-sections
|
LD_FLAGS_BIN= -static -N --gc-sections
|
||||||
|
|
||||||
.if ${MACHINE_CPUARCH} == "amd64"
|
.if ${MACHINE_CPUARCH} == "amd64"
|
||||||
DO32=1
|
DO32=1
|
||||||
|
@ -1,11 +1,17 @@
|
|||||||
/* $FreeBSD$ */
|
/* $FreeBSD$ */
|
||||||
/* Merge text, data and bss together almost no padding */
|
/* Simplified linker script for the boot loaders. */
|
||||||
OUTPUT_FORMAT("elf32-i386-freebsd")
|
OUTPUT_FORMAT("elf32-i386-freebsd")
|
||||||
OUTPUT_ARCH(i386)
|
OUTPUT_ARCH(i386)
|
||||||
ENTRY(_start)
|
ENTRY(_start)
|
||||||
SECTIONS {
|
SECTIONS {
|
||||||
. = 0x08048000 + SIZEOF_HEADERS;
|
. = ORG;
|
||||||
.text : { *(.text) } =0x90909090 /* Pad with nops, if needed */
|
.text : { *(.text .text.*) } =0xcccccccc /* Pad with int3, if needed */
|
||||||
.data : { *(.data) } _edata = .;
|
.rodata : { *(.rodata .rodata.*) }
|
||||||
.bss : { *(.bss) } _end = .;
|
.got : { *(.got) *(.igot) }
|
||||||
|
.got.plt : { *(.got.plt) *(.igot.plt) }
|
||||||
|
.data : { *(.data .data.*) }
|
||||||
|
_edata = .; PROVIDE (edata = .);
|
||||||
|
.bss : { *(.bss .bss.*) }
|
||||||
|
_end = .; PROVIDE (end = .);
|
||||||
|
/DISCARD/ : { *(.interp) }
|
||||||
}
|
}
|
||||||
|
@ -56,7 +56,7 @@ boot1: boot1.out
|
|||||||
${OBJCOPY} -S -O binary boot1.out ${.TARGET}
|
${OBJCOPY} -S -O binary boot1.out ${.TARGET}
|
||||||
|
|
||||||
boot1.out: boot1.o
|
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 \
|
CLEANFILES+= boot2 boot2.ld boot2.ldr boot2.bin boot2.out boot2.o \
|
||||||
boot2.h sio.o
|
boot2.h sio.o
|
||||||
@ -84,7 +84,7 @@ CFLAGS.ashldi3.c= -Wno-missing-prototypes -Wno-missing-declarations
|
|||||||
CLEANFILES+= ashldi3.o
|
CLEANFILES+= ashldi3.o
|
||||||
|
|
||||||
boot2.out: ${BTXCRT} boot2.o sio.o 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
|
SRCS= boot2.c boot2.h
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ gptldr.bin: gptldr.out
|
|||||||
${OBJCOPY} -S -O binary gptldr.out ${.TARGET}
|
${OBJCOPY} -S -O binary gptldr.out ${.TARGET}
|
||||||
|
|
||||||
gptldr.out: gptldr.o
|
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 drv.o \
|
CLEANFILES+= gptboot.bin gptboot.out gptboot.o sio.o drv.o \
|
||||||
cons.o ${OPENCRYPTO_XTS}
|
cons.o ${OPENCRYPTO_XTS}
|
||||||
@ -60,6 +60,6 @@ gptboot.bin: gptboot.out
|
|||||||
${OBJCOPY} -S -O binary gptboot.out ${.TARGET}
|
${OBJCOPY} -S -O binary gptboot.out ${.TARGET}
|
||||||
|
|
||||||
gptboot.out: ${BTXCRT} gptboot.o sio.o drv.o cons.o ${OPENCRYPTO_XTS}
|
gptboot.out: ${BTXCRT} gptboot.o sio.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>
|
.include <bsd.prog.mk>
|
||||||
|
@ -57,7 +57,7 @@ gptldr.bin: gptldr.out
|
|||||||
${OBJCOPY} -S -O binary gptldr.out ${.TARGET}
|
${OBJCOPY} -S -O binary gptldr.out ${.TARGET}
|
||||||
|
|
||||||
gptldr.out: gptldr.o
|
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 \
|
CLEANFILES+= gptzfsboot.bin gptzfsboot.out zfsboot.o sio.o cons.o \
|
||||||
drv.o gpt.o ${OPENCRYPTO_XTS}
|
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 \
|
gptzfsboot.out: ${BTXCRT} zfsboot.o sio.o gpt.o drv.o cons.o \
|
||||||
${OPENCRYPTO_XTS}
|
${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
|
zfsboot.o: ${ZFSSRC}/zfsimpl.c
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ gptldr.bin: gptldr.out
|
|||||||
${OBJCOPY} -S -O binary gptldr.out ${.TARGET}
|
${OBJCOPY} -S -O binary gptldr.out ${.TARGET}
|
||||||
|
|
||||||
gptldr.out: gptldr.o
|
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 drv.o \
|
CLEANFILES+= isoboot.bin isoboot.out isoboot.o sio.o drv.o \
|
||||||
cons.o ${OPENCRYPTO_XTS}
|
cons.o ${OPENCRYPTO_XTS}
|
||||||
@ -62,6 +62,6 @@ isoboot.bin: isoboot.out
|
|||||||
${OBJCOPY} -S -O binary isoboot.out ${.TARGET}
|
${OBJCOPY} -S -O binary isoboot.out ${.TARGET}
|
||||||
|
|
||||||
isoboot.out: ${BTXCRT} isoboot.o sio.o drv.o cons.o ${OPENCRYPTO_XTS}
|
isoboot.out: ${BTXCRT} isoboot.o sio.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>
|
.include <bsd.prog.mk>
|
||||||
|
@ -46,8 +46,10 @@ HELP_FILES= ${.CURDIR}/help.i386
|
|||||||
|
|
||||||
CLEANFILES+= ${LOADER} ${LOADER}.bin
|
CLEANFILES+= ${LOADER} ${LOADER}.bin
|
||||||
|
|
||||||
|
ORG= 0x0
|
||||||
|
|
||||||
CFLAGS+= -Wall
|
CFLAGS+= -Wall
|
||||||
LDFLAGS+= -static -Ttext 0x0 -Wl,--gc-sections
|
LDFLAGS+= -static ${LDFLAGS_ORG} -Wl,--gc-sections
|
||||||
|
|
||||||
# i386 standalone support library
|
# i386 standalone support library
|
||||||
LIBI386= ${BOOTOBJ}/i386/libi386/libi386.a
|
LIBI386= ${BOOTOBJ}/i386/libi386/libi386.a
|
||||||
|
@ -49,7 +49,7 @@ zfsboot1: zfsldr.out
|
|||||||
${OBJCOPY} -S -O binary zfsldr.out ${.TARGET}
|
${OBJCOPY} -S -O binary zfsldr.out ${.TARGET}
|
||||||
|
|
||||||
zfsldr.out: zfsldr.o
|
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 \
|
CLEANFILES+= zfsboot2 zfsboot.ld zfsboot.ldr zfsboot.bin zfsboot.out \
|
||||||
zfsboot.o zfsboot.s zfsboot.s.tmp sio.o cons.o drv.o
|
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}
|
${OBJCOPY} -S -O binary zfsboot.out ${.TARGET}
|
||||||
|
|
||||||
zfsboot.out: ${BTXCRT} zfsboot.o sio.o drv.o cons.o
|
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
|
SRCS= zfsboot.c
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user