[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.de • http://www.coresystems.de/
Registergericht: Amtsgericht Freiburg • HRB 7656
Geschäftsführer: Stefan Reinauer • Ust-IdNr.: DE245674866
More information about the coreboot
mailing list