Re: boot2 overflow when building with clang

From: Jung-uk Kim <jkim_at_FreeBSD.org>
Date: Wed, 7 Mar 2012 19:18:56 -0500
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

Received on Wed Mar 07 2012 - 23:19:08 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:24 UTC