The envcrc.c does sizeof(unsigned long) when calculating the crc, but this is done with the build toolchain instead of the target toolchain, so if the build is a 64bit system but the target is 32bits, the size will obviously be wrong. This introduces a sizeof.sh script to calculate the required sizeof() value of any type with any compiler.
Signed-off-by: Mike Frysinger <[EMAIL PROTECTED]> --- Changes: - adds copyright/license - increase limit to 512 - increment by 4 bytes to find "32bit naturals" faster: (old/new # = number of times gcc is called) type | sizeof | old | new char | 1 | 1 | 5 short | 2 | 2 | 4 int | 4 | 4 | 2 long | 8 | 8 | 3 double | 8 | 8 | 3 --- tools/Makefile | 2 +- tools/envcrc.c | 4 ++-- tools/sizeof.sh | 45 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 3 deletions(-) create mode 100755 tools/sizeof.sh diff --git a/tools/Makefile b/tools/Makefile index 8784a6d..7351f28 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -168,7 +168,7 @@ $(obj)mpc86x_clk$(SFX): $(obj)mpc86x_clk.o $(STRIP) $@ $(obj)envcrc.o: $(src)envcrc.c - $(CC) -g $(CFLAGS) -c -o $@ $< + $(CC) -g $(CFLAGS) -c -o $@ $< -DTARGET_SIZEOF_ULONG=$(shell $(CONFIG_SHELL) $(src)sizeof.sh unsigned long) $(obj)ubsha1.o: $(src)ubsha1.c $(CC) -g $(CFLAGS) -c -o $@ $< diff --git a/tools/envcrc.c b/tools/envcrc.c index 7b77183..afde912 100644 --- a/tools/envcrc.c +++ b/tools/envcrc.c @@ -58,9 +58,9 @@ #endif /* CFG_ENV_IS_IN_FLASH */ #ifdef CFG_REDUNDAND_ENVIRONMENT -# define ENV_HEADER_SIZE (sizeof(unsigned long) + 1) +# define ENV_HEADER_SIZE (TARGET_SIZEOF_ULONG + 1) #else -# define ENV_HEADER_SIZE (sizeof(unsigned long)) +# define ENV_HEADER_SIZE (TARGET_SIZEOF_ULONG) #endif #define ENV_SIZE (CFG_ENV_SIZE - ENV_HEADER_SIZE) diff --git a/tools/sizeof.sh b/tools/sizeof.sh new file mode 100755 index 0000000..4eadb3c --- /dev/null +++ b/tools/sizeof.sh @@ -0,0 +1,45 @@ +#!/bin/sh +# Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006 Free Software +# Foundation, Inc. +# Licensed under the GPL-2 or later. + +# +# Get the sizeof(type) for a compiler +# + +type="$*" +CC=${CC:-gcc} + +if [ -z "$type" ] ; then + echo "Usage: sizeof.sh <type>" 1>&2 + exit 1 +fi + +test_size() { + cat <<-EOF > sizeof.c + typedef $type ac__type_sizeof_; + int main() { + static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $size)]; + test_array [0] = 0; + return 0; + } + EOF + ${CC} -c sizeof.c >/dev/null 2>&1 + ret=$? + rm -f sizeof.[co] + return $ret +} + +size=4 +while [ ${size} -lt 512 ] ; do + if test_size ${size} ; then + ((size-=1)) + while test_size ${size} ; do + ((size-=1)) + done + echo $((size+1)) + exit 0 + fi + ((size+=4)) +done +exit 1 -- 1.5.4.4 ------------------------------------------------------------------------- Check out the new SourceForge.net Marketplace. It's the best place to buy or sell services for just about anything Open Source. http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace _______________________________________________ U-Boot-Users mailing list U-Boot-Users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/u-boot-users