boot2 overflow when building with clang

Jung-uk Kim jkim at FreeBSD.org
Thu Mar 8 20:01:31 UTC 2012


On Thursday 08 March 2012 10:46 am, John Baldwin wrote:
> On Wednesday, March 07, 2012 7:18:56 pm Jung-uk Kim wrote:
> > 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
>
> I would really rather not go this route.  That is going to cause a
> lot of pain and suffering for users.

Well, I disagree but don't worrry, I won't commit it today. ;-)

Just in case, I updated the patch to build UFS1+UFS2 boot2 by default 
for GCC as Peter suggested.

Also, I have created a project branch on SVN to increase UFS2 boot 
block size.

http://svnweb.freebsd.org/base/projects/bigbb/

Jung-uk Kim


More information about the freebsd-current mailing list