[coreboot] [PATCH] v3: section correctness checker

Stefan Reinauer stepan at coresystems.de
Wed Aug 20 17:49:55 CEST 2008


Carl-Daniel Hailfinger wrote:
> On 20.08.2008 15:33, Carl-Daniel Hailfinger wrote:
>   
>> v3 does not handle .data and .bss sections in stage1 and initram. We
>> simply hope they are unused/empty and will get runtime
>> crashes/corruption/malfunction if they are not empty.
>>
>> Check for the emptiness of these sections and abort the build on error.
>> This triggers on all stage1/initram global variables which are not
>> declared the right way.
>>
>> This found a long-standing bug introduced in r729 and fixed in r576.
>> It also breaks the build of every Geode target in the v3 tree because
>> they have multiple bugs. And it breaks the build of the K8 code because
>> of a bug there.
>>
>> Tested for all possible variations of .data and .bss usage.
>>
>> Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>
>>   
>>     
>
> Better checker follows. It does not only tell you the name of the object
> file with the bug, it even gives you the variable name which caused the bug:
>   CHECK   initram (non-empty .data sections)
> /sources/tmptrees/corebootv3-check_illegal_global_vars/build/coreboot.initram_partiallylinked.o:
> first_time.3526
> make: ***
> [/sources/tmptrees/corebootv3-check_illegal_global_vars/build/coreboot.initram]
> Error 1
>
> Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>
>   

Hm.. should we pack this into a small shell script (similar to xcompile) ?
Duplicating (almost) the same code 4 times is a bit ugly.

Also,  please use $(OBJDUMP), as on any cross compiling system objdump
will not be there, or for a different architecture.

> Index: corebootv3-check_illegal_global_vars/arch/x86/Makefile
> ===================================================================
> --- corebootv3-check_illegal_global_vars/arch/x86/Makefile	(revision 790)
> +++ corebootv3-check_illegal_global_vars/arch/x86/Makefile	(working copy)
> @@ -143,6 +143,30 @@
>  	$(Q)# 0x4000 - 0x100, we will end up with a 4 gig file.
>  	$(Q)# I wonder if that behavior is on purpose.
>  
> +	$(Q)# .data and .bss must be empty because they aren't handled
> +	$(Q)printf "  CHECK   stage0 (non-empty .data sections)\n"
> +	$(Q)objdump -h $(STAGE0_OBJ)| grep "^$(obj)/\|\.data"|\
> +		grep -v "\.data[[:blank:]]\+00000000[[:blank:]]"|\
> +		grep -B1 "\.data"| grep "^$(obj)/"|\
> +		cut -f 1 -d:| while read a; do \
> +		echo -n "$$a: "; \
> +		objdump -t --section=.data $$a|\
> +		grep -i "^[0-9a-f]\{8\}"|grep -v "00000000 [^ ]\+$$"|\
> +		sed "s/.* //"| xargs echo; \
> +		done| \
> +		grep "^$(obj)/"; test $$? -ne 0
> +	$(Q)printf "  CHECK   stage0 (non-empty .bss sections)\n"
> +	$(Q)objdump -h $(STAGE0_OBJ)| grep "^$(obj)/\|\.bss"|\
> +		grep -v "\.bss[[:blank:]]\+00000000[[:blank:]]"|\
> +		grep -B1 "\.bss"| grep "^$(obj)/"|\
> +		cut -f 1 -d:| while read a; do \
> +		echo -n "$$a: "; \
> +		objdump -t --section=.bss $$a|\
> +		grep -i "^[0-9a-f]\{8\}"|grep -v "00000000 [^ ]\+$$"|\
> +		sed "s/.* //"| xargs echo; \
> +		done| \
> +		grep "^$(obj)/"; test $$? -ne 0
> +
>  	$(Q)# Note: we invoke gcc (instead of ld directly) here, as we hit
>  	$(Q)# strange problems in the past. It seems that only gcc knows how
>  	$(Q)# to properly invoke ld.
> @@ -264,6 +288,33 @@
>  $(obj)/coreboot.initram $(obj)/coreboot.initram.map: $(obj)/stage0.init $(obj)/stage0-prefixed.o $(INITRAM_SRC)
>  	$(Q)printf "  CC      $(subst $(shell pwd)/,,$(@)) (XIP)\n"
>  	$(Q)$(CC) $(INITCFLAGS) -fPIE -c -combine $(INITRAM_SRC) -o $(obj)/coreboot.initram_partiallylinked.o
> +
> +	$(Q)# .data and .bss must be empty because they aren't handled
> +	$(Q)printf "  CHECK   initram (non-empty .data sections)\n"
> +	$(Q)objdump -h $(obj)/coreboot.initram_partiallylinked.o|\
> +		grep "^$(obj)/\|\.data"|\
> +		grep -v "\.data[[:blank:]]\+00000000[[:blank:]]"|\
> +		grep -B1 "\.data"| grep "^$(obj)/"|\
> +		cut -f 1 -d:| while read a; do \
> +		echo -n "$$a: "; \
> +		objdump -t --section=.data $$a|\
> +		grep -i "^[0-9a-f]\{8\}"|grep -v "00000000 [^ ]\+$$"|\
> +		sed "s/.* //"| xargs echo; \
> +		done| \
> +		grep "^$(obj)/"; test $$? -ne 0
> +	$(Q)printf "  CHECK   initram (non-empty .bss sections)\n"
> +	$(Q)objdump -h $(obj)/coreboot.initram_partiallylinked.o|\
> +		grep "^$(obj)/\|\.bss"|\
> +		grep -v "\.bss[[:blank:]]\+00000000[[:blank:]]"|\
> +		grep -B1 "\.bss"| grep "^$(obj)/"|\
> +		cut -f 1 -d:| while read a; do \
> +		echo -n "$$a: "; \
> +		objdump -t --section=.bss $$a|\
> +		grep -i "^[0-9a-f]\{8\}"|grep -v "00000000 [^ ]\+$$"|\
> +		sed "s/.* //"| xargs echo; \
> +		done| \
> +		grep "^$(obj)/"; test $$? -ne 0
> +
>  	$(Q)printf "  WRAP    $(subst $(shell pwd)/,,$(@)) (PIC->non-PIC)\n"
>  	$(Q)$(NM) --undefined-only $(obj)/coreboot.initram_partiallylinked.o |\
>  		grep -v _GLOBAL_OFFSET_TABLE_ | grep " U " | sed "s/^ *U //" |\
>
>
>   


-- 
coresystems GmbH • Brahmsstr. 16 • D-79104 Freiburg i. Br.
      Tel.: +49 761 7668825 • Fax: +49 761 7664613
Email: info at coresystems.dehttp://www.coresystems.de/
Registergericht: Amtsgericht Freiburg • HRB 7656
Geschäftsführer: Stefan Reinauer • Ust-IdNr.: DE245674866





More information about the coreboot mailing list