boot2 overflow when building with clang
Jung-uk Kim
jkim at FreeBSD.org
Thu Mar 8 00:19:08 UTC 2012
On Tuesday 06 March 2012 11:51 pm, Jia-Shiun Li wrote:
> I am not familiar with boot2, but it looks like allocated size for
> boot2 is not enough to hold code generated by clang. Reverting
> r232570 fixes it.
>
> ===> sys/boot/i386/boot2 (all)
> objcopy -S -O binary boot1.out boot1
> dd if=/dev/zero of=boot2.ldr bs=512 count=1
> clang -Os -fno-guess-branch-probability -fomit-frame-pointer
> -fno-unit-at-a-time -mno-align-long-strings -mrtd -mregparm=3
> -DUSE_XREAD -DUFS1_AND_UFS2 -DFLAGS=0x80 -DSIOPRT=0x3f8
> -DSIOFMT=0x3 -DSIOSPD=9600
> -I/usr/src/sys/boot/i386/boot2/../../common
> -I/usr/src/sys/boot/i386/boot2/../btx/lib -I. -Wall
> -Waggregate-return -Wbad-function-cast -Wcast-align
> -Wmissing-declarations -Wmissing-prototypes -Wnested-externs
> -Wpointer-arith -Wshadow -Wstrict-prototypes -Wwrite-strings
> -Winline --param max-inline-insns-single=100 -mllvm
> -stack-alignment=8 -mllvm -inline-threshold=3 -mllvm
> -enable-load-pre=false -ffreestanding -mpreferred-stack-boundary=2
> -mno-mmx -mno-3dnow -mno-sse -mno-sse2 -mno-sse3 -msoft-float
> -std=gnu99 -S -o boot2.s.tmp
> /usr/src/sys/boot/i386/boot2/boot2.c
> sed -e '/align/d' -e '/nop/d' < boot2.s.tmp > boot2.s
> rm -f boot2.s.tmp
> clang -c boot2.s
> clang -Os -fno-guess-branch-probability -fomit-frame-pointer
> -fno-unit-at-a-time -mno-align-long-strings -mrtd -mregparm=3
> -DUSE_XREAD -DUFS1_AND_UFS2 -DFLAGS=0x80 -DSIOPRT=0x3f8
> -DSIOFMT=0x3 -DSIOSPD=9600
> -I/usr/src/sys/boot/i386/boot2/../../common
> -I/usr/src/sys/boot/i386/boot2/../btx/lib -I. -Wall
> -Waggregate-return -Wbad-function-cast -Wcast-align
> -Wmissing-declarations -Wmissing-prototypes -Wnested-externs
> -Wpointer-arith -Wshadow -Wstrict-prototypes -Wwrite-strings
> -Winline --param max-inline-insns-single=100 -mllvm
> -stack-alignment=8 -mllvm -inline-threshold=3 -mllvm
> -enable-load-pre=false -ffreestanding -mpreferred-stack-boundary=2
> -mno-mmx -mno-3dnow -mno-sse -mno-sse2 -mno-sse3 -msoft-float
> -std=gnu99 -c
> /usr/src/sys/boot/i386/boot2/sio.S
> ld -static -N --gc-sections -nostdlib -Ttext 0x2000 -o boot2.out
> /usr/obj/usr/src/sys/boot/i386/boot2/../btx/lib/crt0.o boot2.o
> sio.o objcopy -S -O binary boot2.out boot2.bin
> btxld -v -E 0x2000 -f bin -b
> /usr/obj/usr/src/sys/boot/i386/boot2/../btx/btx/btx -l boot2.ldr
> -o boot2.ld -P 1 boot2.bin
> kernel: ver=1.02 size=690 load=9000 entry=9010 map=16M pgctl=1:1
> client: fmt=bin size=15a1 text=0 data=0 bss=0 entry=0
> output: fmt=bin size=1e31 text=200 data=1c31 org=0 entry=0
> -49 bytes available
> *** [boot2] Error code 1
>
> Stop in /usr/src/sys/boot/i386/boot2.
> *** [all] Error code 1
>
> Stop in /usr/src/sys/boot/i386.
> *** [all] Error code 1
>
> Stop in /usr/src/sys/boot.
> *** [all] Error code 1
>
> Stop in /usr/src/sys.
> *** [sys.all__D] Error code 1
>
> Stop in /usr/src.
> *** [everything] Error code 1
>
> Stop in /usr/src.
> *** [buildworld] Error code 1
>
> Stop in /usr/src.
Here is a patch to work around the problem:
http://people.freebsd.org/~jkim/boot2.diff
Please note this patch creates two separate boot codes, one for UFS1
and one for UFS2. To generate previous boot code (i.e., UFS1+UFS2)
with GCC, clean objects, add the following line to
your /etc/make.conf, rebuild, and install:
BOOT2_UFS=UFS1_AND_UFS2
Cheers,
Jung-uk Kim
-------------- next part --------------
Index: sys/boot/i386/Makefile
===================================================================
--- sys/boot/i386/Makefile (revision 232670)
+++ sys/boot/i386/Makefile (working copy)
@@ -2,8 +2,8 @@
.include <bsd.own.mk>
-SUBDIR= mbr pmbr boot0 boot0sio btx boot2 cdboot gptboot kgzldr \
- libi386 libfirewire loader
+SUBDIR= mbr pmbr boot0 boot0sio btx boot2 boot2ufs1 cdboot gptboot \
+ kgzldr libi386 libfirewire loader
# special boot programs, 'self-extracting boot2+loader'
SUBDIR+= pxeldr
Index: sys/boot/i386/boot2/Makefile
===================================================================
--- sys/boot/i386/boot2/Makefile (revision 232670)
+++ sys/boot/i386/boot2/Makefile (working copy)
@@ -2,8 +2,10 @@
.include <bsd.own.mk>
-FILES= boot boot1 boot2
+FILES= boot${BOOT_SUFFIX} boot2${BOOT2_SUFFIX}
+SRCDIR= ${.CURDIR}/../boot2
+
NM?= nm
# A value of 0x80 enables LBA support.
@@ -18,10 +20,22 @@ ORG1= 0x7c00
ORG2= 0x2000
# Decide level of UFS support.
-BOOT2_UFS?= UFS1_AND_UFS2
-#BOOT2_UFS?= UFS2_ONLY
-#BOOT2_UFS?= UFS1_ONLY
+BOOT2_UFS?= UFS2_ONLY
+#BOOT2_UFS?= UFS1_AND_UFS2
+.if ${BOOT2_UFS} != UFS1_ONLY
+FILES+= boot1
+.endif
+.if ${BOOT2_UFS} == UFS1_ONLY
+BOOT_SUFFIX= .ufs1
+BOOT2_SUFFIX= ufs1
+.elif ${BOOT2_UFS} == UFS2_ONLY
+BOOT_SUFFIX= .ufs2
+BOOT2_SUFFIX= ufs2
+LINKS= ${BINDIR}/boot${BOOT_SUFFIX} ${BINDIR}/boot \
+ ${BINDIR}/boot2${BOOT2_SUFFIX} ${BINDIR}/boot2
+.endif
+
CFLAGS= -Os \
-fno-guess-branch-probability \
-fomit-frame-pointer \
@@ -50,8 +64,8 @@ LDFLAGS=-static -N --gc-sections
CLEANFILES= boot
-boot: boot1 boot2
- cat boot1 boot2 > boot
+boot${BOOT_SUFFIX}: boot1 boot2${BOOT2_SUFFIX}
+ cat ${.ALLSRC} > ${.TARGET}
CLEANFILES+= boot1 boot1.out boot1.o
@@ -64,7 +78,7 @@ boot1.out: boot1.o
CLEANFILES+= boot2 boot2.ld boot2.ldr boot2.bin boot2.out boot2.o \
boot2.s boot2.s.tmp boot2.h sio.o
-boot2: boot2.ld
+boot2${BOOT2_SUFFIX}: boot2.ld
@set -- `ls -l boot2.ld`; x=$$((7680-$$5)); \
echo "$$x bytes available"; test $$x -ge 0
dd if=boot2.ld of=${.TARGET} obs=7680 conv=osync
@@ -88,7 +102,7 @@ boot2.o: boot2.s
SRCS= boot2.c boot2.h
boot2.s: boot2.c boot2.h ${.CURDIR}/../../common/ufsread.c
- ${CC} ${CFLAGS} -S -o boot2.s.tmp ${.CURDIR}/boot2.c
+ ${CC} ${CFLAGS} -S -o boot2.s.tmp ${SRCDIR}/boot2.c
sed -e '/align/d' -e '/nop/d' < boot2.s.tmp > boot2.s
rm -f boot2.s.tmp
Index: sys/boot/i386/boot2ufs1/Makefile
===================================================================
--- sys/boot/i386/boot2ufs1/Makefile (revision 0)
+++ sys/boot/i386/boot2ufs1/Makefile (working copy)
@@ -0,0 +1,7 @@
+# $FreeBSD$
+
+.PATH: ${.CURDIR}/../boot2
+
+BOOT2_UFS= UFS1_ONLY
+
+.include "${.CURDIR}/../boot2/Makefile"
Property changes on: sys/boot/i386/boot2ufs1/Makefile
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+FreeBSD=%H
\ No newline at end of property
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
More information about the freebsd-current
mailing list