tools/mkimage: backport SOURCE_DATE_EPOCH for reproducible builds

This pulls in Paul Kocialkowski's SOURCE_DATE_EPOCH support patch for u-boot,
which landed upstream circa July 2015. Note that this "host" u-boot repo is
only used to compile the 'mkimage' utility, and isn't used to actually compile
a bootloader for any target.

This patch could be removed if/when the host u-boot package is updated to a
contemporary version (but there doesn't seem to be any motivation/need to do
so).

Signed-off-by: bryan newbold <bnewbold@robocracy.org>
Signed-off-by: Felix Fietkau <nbd@openwrt.org> [fix portability error, refresh patches]

SVN-Revision: 48542
owl
Felix Fietkau 2016-01-28 22:42:44 +00:00
parent b3f7902a06
commit 37f09b8129
4 changed files with 88 additions and 12 deletions

View File

@ -1,6 +1,6 @@
--- a/include/image.h
+++ b/include/image.h
@@ -44,6 +44,10 @@
@@ -44,6 +44,10 @@ struct lmb;
#endif /* USE_HOSTCC */

View File

@ -1,6 +1,6 @@
--- a/tools/mkimage.c
+++ b/tools/mkimage.c
@@ -24,6 +24,7 @@
@@ -24,6 +24,7 @@ struct image_tool_params params = {
.arch = IH_ARCH_PPC,
.type = IH_TYPE_KERNEL,
.comp = IH_COMP_GZIP,
@ -8,7 +8,7 @@
.dtc = MKIMAGE_DEFAULT_DTC_OPTIONS,
.imagename = "",
.imagename2 = "",
@@ -168,6 +169,16 @@
@@ -168,6 +169,16 @@ main (int argc, char **argv)
genimg_get_comp_id (*++argv)) < 0)
usage ();
goto NXTARG;
@ -25,7 +25,7 @@
case 'D':
if (--argc <= 0)
usage ();
@@ -623,12 +634,13 @@
@@ -623,12 +634,13 @@ static void usage(void)
fprintf (stderr, "Usage: %s -l image\n"
" -l ==> list image header information\n",
params.cmdname);
@ -42,7 +42,7 @@
" -n ==> set image name to 'name'\n"
--- a/tools/default_image.c
+++ b/tools/default_image.c
@@ -98,7 +98,7 @@
@@ -98,7 +98,7 @@ static void image_set_header(void *ptr,
sbuf->st_size - sizeof(image_header_t));
/* Build new header */
@ -53,7 +53,7 @@
image_set_load(hdr, params->addr);
--- a/tools/imagetool.h
+++ b/tools/imagetool.h
@@ -44,6 +44,7 @@
@@ -44,6 +44,7 @@ struct image_tool_params {
int arch;
int type;
int comp;

View File

@ -0,0 +1,82 @@
From f3f431a712729a1af94d01bd1bfde17a252ff02c Mon Sep 17 00:00:00 2001
From: Paul Kocialkowski <contact@paulk.fr>
Date: Sun, 26 Jul 2015 18:48:15 +0200
Subject: [PATCH] Reproducible U-Boot build support, using SOURCE_DATE_EPOCH
In order to achieve reproducible builds in U-Boot, timestamps that are defined
at build-time have to be somewhat eliminated. The SOURCE_DATE_EPOCH environment
variable allows setting a fixed value for those timestamps.
Simply by setting SOURCE_DATE_EPOCH to a fixed value, a number of targets can be
built reproducibly. This is the case for e.g. sunxi devices.
However, some other devices might need some more tweaks, especially regarding
the image generation tools.
Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
---
Makefile | 7 ++++---
README | 12 ++++++++++++
tools/default_image.c | 21 ++++++++++++++++++++-
3 files changed, 36 insertions(+), 4 deletions(-)
--- a/README
+++ b/README
@@ -4928,6 +4928,18 @@ within that device.
normal addressable memory via the LBC. CONFIG_SYS_LS_MC_FW_ADDR is the
virtual address in NOR flash.
+Reproducible builds
+-------------------
+
+In order to achieve reproducible builds, timestamps used in the U-Boot build
+process have to be set to a fixed value.
+
+This is done using the SOURCE_DATE_EPOCH environment variable.
+SOURCE_DATE_EPOCH is to be set on the build host's shell, not as a configuration
+option for U-Boot or an environment variable in U-Boot.
+
+SOURCE_DATE_EPOCH should be set to a number of seconds since the epoch, in UTC.
+
Building the Software:
======================
--- a/tools/default_image.c
+++ b/tools/default_image.c
@@ -89,6 +89,9 @@ static void image_set_header(void *ptr,
struct image_tool_params *params)
{
uint32_t checksum;
+ char *source_date_epoch;
+ struct tm *time_universal;
+ time_t time;
image_header_t * hdr = (image_header_t *)ptr;
@@ -97,9 +100,25 @@ static void image_set_header(void *ptr,
sizeof(image_header_t)),
sbuf->st_size - sizeof(image_header_t));
+ source_date_epoch = getenv("SOURCE_DATE_EPOCH");
+ if (source_date_epoch != NULL) {
+ time = (time_t) strtol(source_date_epoch, NULL, 10);
+
+ time_universal = gmtime(&time);
+ if (time_universal == NULL) {
+ fprintf(stderr, "%s: SOURCE_DATE_EPOCH is not valid\n",
+ __func__);
+ time = 0;
+ } else {
+ time = mktime(time_universal);
+ }
+ } else {
+ time = sbuf->st_mtime;
+ }
+
/* Build new header */
image_set_magic(hdr, params->magic);
- image_set_time(hdr, sbuf->st_mtime);
+ image_set_time(hdr, time);
image_set_size(hdr, sbuf->st_size - sizeof(image_header_t));
image_set_load(hdr, params->addr);
image_set_ep(hdr, params->ep);

View File

@ -17,9 +17,6 @@ Signed-off-by: Hans de Goede <hdegoede@redhat.com>
1 file changed, 65 insertions(+)
create mode 100644 include/linux/compiler-gcc5.h
diff --git a/include/linux/compiler-gcc5.h b/include/linux/compiler-gcc5.h
new file mode 100644
index 0000000..c8c5659
--- /dev/null
+++ b/include/linux/compiler-gcc5.h
@@ -0,0 +1,65 @@
@ -88,6 +85,3 @@ index 0000000..c8c5659
+#define __HAVE_BUILTIN_BSWAP64__
+#define __HAVE_BUILTIN_BSWAP16__
+#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */
--
1.7.10.4