With this option enabled each compilation creates the exact same binary. There are no timestamps, with which a U-Boot binary can be identified.
This option is disabled by default. Signed-off-by: Heiko Schocher <h...@denx.de> Tested-by: Chris Kuethe <chris.kue...@gmail.com> --- For testing this patch, I wrote the following 2 scripts, and add a patch, which enables CONFIG_SYS_EXACT_BINARY, as this is normally disabled in default configs. steps: - create file, which contains a list of boards you want to check, if they create a date/time independent binary for example: $ cat test_list at91sam9g20ek_2mmc cairo corvus smartweb axm - create reference files with $ ./comp_list_boards.sh test_list init init boards in test_list check board at91sam9g20ek_2mmc init at91sam9g20ek_2mmc check board cairo init cairo check board corvus init corvus check board smartweb init smartweb check board axm init axm - start another round of compile and compare with base $ ./comp_list_boards.sh test_list checking boards in test_list check board at91sam9g20ek_2mmc compile at91sam9g20ek_2mmc check board cairo compile cairo check board corvus compile corvus check board smartweb compile smartweb check board axm compile axm and here the scripts: exact_bin_defconfig.patch: --- a/.config 2015-06-15 15:53:11.855529259 +0200 +++ b/.config 2015-06-15 15:53:00.186220214 +0200 @@ -228,7 +228,7 @@ CONFIG_LOCALVERSION_AUTO=y CONFIG_CC_OPTIMIZE_FOR_SIZE=y # CONFIG_SYS_MALLOC_F is not set CONFIG_EXPERT=y -# CONFIG_SYS_EXACT_BINARY is not set +CONFIG_SYS_EXACT_BINARY=y # # Boot images ------------------------------------------- comp_diff_board.sh base_bin_dir="base_bin" logfile_base="/tmp/comp" boardname="" if [ $# -lt 1 ] then echo "need boardname" exit 1 else boardname=$1 fi if [ ! -d "$logfile_base" ] then mkdir $logfile_base fi logfile=$logfile_base"/"$boardname".log" init=0 if [ $# -lt 2 ] then echo compile $boardname else init=1 echo init $boardname fi if [ -e $logfile ] then rm -rf $logfile fi function diff_and_fail (){ echo "-------------------------------------" echo $boardname has differences if [ -n "$2" ] then hexdump -C $2 > gnlmpf2 else hexdump -C $base_bin_dir/$boardname-$1 > gnlmpf2 fi hexdump -C $1 > gnlmpf echo "-------------------------------------" exit 1 } function diff_or_cp (){ if [ $init -eq 1 ] then if [ -n "$2" ] then cp $1 $base_bin_dir/$boardname-$2 else cp $1 $base_bin_dir/$boardname-$1 fi else if [ -n "$2" ] then cmp $1 $base_bin_dir/$boardname-$2 if [ $? -ne 0 ]; then diff_and_fail $1 $base_bin_dir/$boardname-$2 fi else cmp $1 $base_bin_dir/$boardname-$1 if [ $? -ne 0 ]; then diff_and_fail $1 fi fi fi } make mrproper &>>$logfile git reset --hard HEAD &>>$logfile make $boardname"_defconfig" &>>$logfile patch -p1 < exact_bin_defconfig.patch &>>$logfile make -s all &>>$logfile if [ -s "u-boot.bin" ]; then diff_or_cp u-boot.bin fi if [ -s "spl/u-boot-spl.bin" ]; then diff_or_cp spl/u-boot-spl.bin u-boot-spl.bin fi if [ -s "u-boot.img" ]; then diff_or_cp u-boot.img fi if [ -s "u-boot.kwb" ]; then diff_or_cp u-boot.kwb fi if [ -s "u-boot.pbl" ]; then diff_or_cp u-boot.pbl fi if [ -s "u-boot.pbl" ]; then diff_or_cp u-boot.pbl fi if [ -s "MLO" ]; then diff_or_cp MLO fi ------------------------------------------- comp_list_boards.sh if [ $# -lt 1 ] then echo "need boardlist" exit 1 else boardlist=$1 fi init=0 if [ $# -lt 2 ] then echo checking boards in $boardlist else init=1 echo init boards in $boardlist fi while read line do echo check board $line if [ $init -eq 1 ] then comp_diff_board.sh $line init else comp_diff_board.sh $line fi done < $boardlist Changes in v2: - add Tested-by: Chris Kuethe <chris.kue...@gmail.com> - add new cmdline parameter for mkimage "-b" so mkimage creates also headers without date/timing information - add in patch notes 2 scripts and a patch for checking if created binaries are really time/date independent. Kconfig | 9 +++++++++ Makefile | 16 +++++++++++++++- tools/default_image.c | 2 ++ tools/imagetool.h | 1 + tools/mkimage.c | 5 +++++ 5 files changed, 32 insertions(+), 1 deletion(-) diff --git a/Kconfig b/Kconfig index 15e15af..c0c7eb8 100644 --- a/Kconfig +++ b/Kconfig @@ -81,6 +81,15 @@ menuconfig EXPERT Only use this if you really know what you are doing. if EXPERT + config SYS_EXACT_BINARY + bool "Create time and date independent binary" + default n + help + With this option enabled each compilation creates the exact + same binary. There are no timestamps, with which a U-Boot + binary can be identified. + This option is disabled by default. + config SYS_MALLOC_CLEAR_ON_INIT bool "Init with zeros the memory reserved for malloc (slow)" default y diff --git a/Makefile b/Makefile index 0a674bf..713a3e2 100644 --- a/Makefile +++ b/Makefile @@ -780,8 +780,14 @@ endif quiet_cmd_objcopy = OBJCOPY $@ cmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@ +ifeq ($(CONFIG_SYS_EXACT_BINARY),y) +MKIMAGEFLAGS_EXTRA = -b +else +MKIMAGEFLAGS_EXTRA = +endif + quiet_cmd_mkimage = MKIMAGE $@ -cmd_mkimage = $(objtree)/tools/mkimage $(MKIMAGEFLAGS_$(@F)) -d $< $@ \ +cmd_mkimage = $(objtree)/tools/mkimage $(MKIMAGEFLAGS_EXTRA) $(MKIMAGEFLAGS_$(@F)) -d $< $@ \ $(if $(KBUILD_VERBOSE:1=), >/dev/null) quiet_cmd_cat = CAT $@ @@ -1230,11 +1236,19 @@ define filechk_version.h echo \#define LD_VERSION_STRING \"$$($(LD) --version | head -n 1)\"; ) endef +ifeq ($(CONFIG_SYS_EXACT_BINARY),y) +define filechk_timestamp.h + (LC_ALL=C date +'#define U_BOOT_DATE "NODATE"'; \ + LC_ALL=C date +'#define U_BOOT_TIME "NOTIME"'; \ + LC_ALL=C date +'#define U_BOOT_TZ "NOTZ"') +endef +else define filechk_timestamp.h (LC_ALL=C date +'#define U_BOOT_DATE "%b %d %C%y"'; \ LC_ALL=C date +'#define U_BOOT_TIME "%T"'; \ LC_ALL=C date +'#define U_BOOT_TZ "%z"') endef +endif $(version_h): include/config/uboot.release FORCE $(call filechk,version.h) diff --git a/tools/default_image.c b/tools/default_image.c index cf5c0d4..9bd3165 100644 --- a/tools/default_image.c +++ b/tools/default_image.c @@ -98,6 +98,8 @@ static void image_set_header(void *ptr, struct stat *sbuf, int ifd, /* Build new header */ image_set_magic(hdr, IH_MAGIC); + if (params->bflag) + sbuf->st_mtime = 0; image_set_time(hdr, sbuf->st_mtime); image_set_size(hdr, sbuf->st_size - sizeof(image_header_t)); image_set_load(hdr, params->addr); diff --git a/tools/imagetool.h b/tools/imagetool.h index b7874f4..3abc385 100644 --- a/tools/imagetool.h +++ b/tools/imagetool.h @@ -33,6 +33,7 @@ * type specific functions */ struct image_tool_params { + int bflag; int dflag; int eflag; int fflag; diff --git a/tools/mkimage.c b/tools/mkimage.c index 5ccd951..38f48f3 100644 --- a/tools/mkimage.c +++ b/tools/mkimage.c @@ -51,6 +51,9 @@ main (int argc, char **argv) genimg_get_arch_id (*++argv)) < 0) usage (); goto NXTARG; + case 'b': + params.bflag = 1; + break; case 'c': if (--argc <= 0) usage(); @@ -544,6 +547,8 @@ static void usage(void) #else fprintf(stderr, "Signing / verified boot not supported (CONFIG_FIT_SIGNATURE undefined)\n"); #endif + fprintf(stderr, " %s -b ==> build exact binary (without date/time stamp)\n", + params.cmdname); fprintf (stderr, " %s -V ==> print version information and exit\n", params.cmdname); -- 2.1.0 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot