* windres.c (define_resource): Use zero for timestamp, making
authorCory Fields <cory@coryfields.com>
Fri, 22 Nov 2013 14:54:33 +0000 (14:54 +0000)
committerNick Clifton <nickc@redhat.com>
Fri, 22 Nov 2013 14:55:56 +0000 (14:55 +0000)
output deterministic. time.h include is no longer needed.
* resres.c (res_append_resource): Likewise.

* pe-dll.c (fill_edata): Only use a real timestamp if
--insert-timestamp was used.
* emultempl/pe.em: Add the --insert-timestamp option.
* emultempl/pep.em: Likewise for 64bit.
* ld.texinfo: Document the --insert-timestamp option.

* libcoff-in.h: Add insert_timestamp flag to the pe_data struct.
* libcoff.h: Regenerate.
* peXXigen.c (_bfd_XXi_only_swap_filehdr_out): Only use a real
timestamp if --insert-timestamp was used.

12 files changed:
bfd/ChangeLog
bfd/libcoff-in.h
bfd/libcoff.h
bfd/peXXigen.c
binutils/ChangeLog
binutils/resres.c
binutils/windres.c
ld/ChangeLog
ld/emultempl/pe.em
ld/emultempl/pep.em
ld/ld.texinfo
ld/pe-dll.c

index 89a8f1b6ea0fa66427db5d770f5919c9e2c9c612..d76b1b4c34d5957b4b99fe50ecf944bde0d12fae 100644 (file)
@@ -1,3 +1,10 @@
+2013-11-22  Cory Fields  <cory@coryfields.com>
+
+       * libcoff-in.h: Add insert_timestamp flag to the pe_data struct.
+       * libcoff.h: Regenerate.
+       * peXXigen.c (_bfd_XXi_only_swap_filehdr_out): Only use a real
+       timestamp if --insert-timestamp was used.
+
 2013-11-19  Roland McGrath  <mcgrathr@google.com>
 
        * elf-nacl.c (nacl_modify_segment_map): Calculate SIZEOF_HEADERS
index 6efbc524a949c9c63b100c58656b8a10fa47832f..49b5f10b0a77579e8cb926026340d67fd2b67f72 100644 (file)
@@ -1,7 +1,5 @@
 /* BFD COFF object file private structure.
-   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
-   Free Software Foundation, Inc.
+   Copyright 1990-2013 Free Software Foundation, Inc.
    Written by Cygnus Support.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -118,6 +116,7 @@ typedef struct pe_tdata
   int dll;
   int has_reloc_section;
   int dont_strip_reloc;
+  bfd_boolean insert_timestamp;
   bfd_boolean (*in_reloc_p) (bfd *, reloc_howto_type *);
   flagword real_flags;
 } pe_data_type;
index 6270bab86b9572b7d76c37561ab13b4925dcac91..19b6d9c8e1ae1d0c9a50d30d707152c3bf09ab32 100644 (file)
@@ -3,9 +3,7 @@
    Run "make headers" in your build bfd/ to regenerate.  */
 
 /* BFD COFF object file private structure.
-   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
-   Free Software Foundation, Inc.
+   Copyright 1990-2013 Free Software Foundation, Inc.
    Written by Cygnus Support.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -122,6 +120,7 @@ typedef struct pe_tdata
   int dll;
   int has_reloc_section;
   int dont_strip_reloc;
+  bfd_boolean insert_timestamp;
   bfd_boolean (*in_reloc_p) (bfd *, reloc_howto_type *);
   flagword real_flags;
 } pe_data_type;
index d0f7a96e1f96d6defed8ac6c3c941db092040c55..287e4a2e3a14fc1414048db84c9374b12c050a9c 100644 (file)
@@ -1,6 +1,5 @@
 /* Support for the generic parts of PE/PEI; the common executable parts.
-   Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-   2005, 2006, 2007, 2008, 2009, 2010  Free Software Foundation, Inc.
+   Copyright 1995-2013 Free Software Foundation, Inc.
    Written by Cygnus Solutions.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -793,7 +792,10 @@ _bfd_XXi_only_swap_filehdr_out (bfd * abfd, void * in, void * out)
   H_PUT_16 (abfd, filehdr_in->f_magic, filehdr_out->f_magic);
   H_PUT_16 (abfd, filehdr_in->f_nscns, filehdr_out->f_nscns);
 
-  H_PUT_32 (abfd, time (0), filehdr_out->f_timdat);
+  /* Only use a real timestamp if the option was chosen.  */
+  if ((pe_data (abfd)->insert_timestamp))
+    H_PUT_32 (abfd, time(0), filehdr_out->f_timdat);
+
   PUT_FILEHDR_SYMPTR (abfd, filehdr_in->f_symptr,
                      filehdr_out->f_symptr);
   H_PUT_32 (abfd, filehdr_in->f_nsyms, filehdr_out->f_nsyms);
index cc9c6f9c5cd304c9a3730539ddce24c4b295509f..ca2a322d3551051c4f40d923a00f56f1015e88c7 100644 (file)
@@ -1,3 +1,9 @@
+2013-11-22  Cory Fields  <cory@coryfields.com>
+
+       * windres.c (define_resource): Use zero for timestamp, making
+       output deterministic. time.h include is no longer needed.
+       * resres.c (res_append_resource): Likewise.
+
 2013-11-13  Martin Mitas  <mity@morous.org>
 
        * rescoff.c (write_coff_file): Use 64-bit alignment for resource
index ff95cb5bea3aa26e34b3353c25f8e67307bc07f9..84f956f1538d2b7952373875aac217da0167bb35 100644 (file)
@@ -1,6 +1,5 @@
 /* resres.c: read_res_file and write_res_file implementation for windres.
-   Copyright 1998, 1999, 2001, 2002, 2005, 2007, 2008, 2011
-   Free Software Foundation, Inc.
+   Copyright 1998-2013 Free Software Foundation, Inc.
    Written by Anders Norlander <anorland@hem2.passagen.se>.
    Rewritten by Kai Tietz, Onevision.
 
@@ -32,7 +31,6 @@
 #include "windres.h"
 
 #include <assert.h>
-#include <time.h>
 
 static rc_uint_type write_res_directory (windres_bfd *, rc_uint_type,
                                         const rc_res_directory *, const rc_res_id *,
@@ -660,17 +658,13 @@ res_append_resource (rc_res_directory **res_dirs, rc_res_resource *resource,
 
       if (*res_dirs == NULL)
        {
-         static unsigned long timeval;
-
-         /* Use the same timestamp for every resource created in a
-            single run.  */
-         if (timeval == 0)
-           timeval = time (NULL);
-
          *res_dirs = ((rc_res_directory *)
                        res_alloc (sizeof (rc_res_directory)));
+
          (*res_dirs)->characteristics = 0;
-         (*res_dirs)->time = timeval;
+         /* Using a real timestamp only serves to create non-deterministic
+            results.  Use zero instead.  */
+         (*res_dirs)->time = 0;
          (*res_dirs)->major = 0;
          (*res_dirs)->minor = 0;
          (*res_dirs)->entries = NULL;
index 7de73ef2f553830c0c5f382908bd93cb91cd7719..64afb3ad6a5fcd48d0637fd733c5460ce5b165b5 100644 (file)
@@ -1,6 +1,5 @@
 /* windres.c -- a program to manipulate Windows resources
-   Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008,
-   2009, 2011, 2012 Free Software Foundation, Inc.
+   Copyright 1997-2013 Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Cygnus Support.
    Rewritten by Kai Tietz, Onevision.
 
@@ -37,7 +36,6 @@
 
 #include "sysdep.h"
 #include <assert.h>
-#include <time.h>
 #include "bfd.h"
 #include "getopt.h"
 #include "bucomm.h"
@@ -339,17 +337,12 @@ define_resource (rc_res_directory **resources, int cids,
 
       if (*resources == NULL)
        {
-         static unsigned int timeval;
-
-         /* Use the same timestamp for every resource created in a
-             single run.  */
-         if (timeval == 0)
-           timeval = time (NULL);
-
          *resources = ((rc_res_directory *)
                        res_alloc (sizeof (rc_res_directory)));
          (*resources)->characteristics = 0;
-         (*resources)->time = timeval;
+         /* Using a real timestamp only serves to create non-deterministic
+            results.  Use zero instead.  */
+         (*resources)->time = 0;
          (*resources)->major = 0;
          (*resources)->minor = 0;
          (*resources)->entries = NULL;
index e98129dc9eb5527908607148f4d6cab93f40838f..4582adb1a4e7d4ab15e12cd494f83e3f76284beb 100644 (file)
@@ -1,3 +1,11 @@
+2013-11-22  Cory Fields  <cory@coryfields.com>
+
+       * pe-dll.c (fill_edata): Only use a real timestamp if
+       --insert-timestamp was used.
+       * emultempl/pe.em: Add the --insert-timestamp option.
+       * emultempl/pep.em: Likewise for 64bit.
+       * ld.texinfo: Document the --insert-timestamp option.
+
 2013-11-22  Senthil Kumar Selvaraj  <senthil_kumar.selvaraj@atmel.com>
 
        * scripttempl/avr.sc: Set .data section's LMA to next available
index 4df7753caa53d6aaacd131cfeeef27f04b15b785..5d6da9e05f14425cfad9cc4ec71e1a20e450b336 100644 (file)
@@ -130,6 +130,7 @@ static int support_old_code = 0;
 static char * thumb_entry_symbol = NULL;
 static lang_assignment_statement_type *image_base_statement = 0;
 static unsigned short pe_dll_characteristics = 0;
+static bfd_boolean insert_timestamp = FALSE;
 
 #ifdef DLL_SUPPORT
 static int pe_enable_stdcall_fixup = -1; /* 0=disable 1=enable.  */
@@ -239,8 +240,7 @@ fragment <<EOF
                                        (OPTION_EXCLUDE_LIBS + 1)
 #define OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC        \
                                        (OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC + 1)
-#define OPTION_LARGE_ADDRESS_AWARE \
-                                       (OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC + 1)
+#define OPTION_LARGE_ADDRESS_AWARE     (OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC + 1)
 #define OPTION_DISABLE_LARGE_ADDRESS_AWARE \
                                        (OPTION_LARGE_ADDRESS_AWARE + 1)
 #define OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V1      \
@@ -251,15 +251,13 @@ fragment <<EOF
                                        (OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V2 + 1)
 #define OPTION_USE_NUL_PREFIXED_IMPORT_TABLES \
                                        (OPTION_EXCLUDE_MODULES_FOR_IMPLIB + 1)
-#define OPTION_NO_LEADING_UNDERSCORE \
-                                       (OPTION_USE_NUL_PREFIXED_IMPORT_TABLES + 1)
-#define OPTION_LEADING_UNDERSCORE \
-                                       (OPTION_NO_LEADING_UNDERSCORE + 1)
+#define OPTION_NO_LEADING_UNDERSCORE   (OPTION_USE_NUL_PREFIXED_IMPORT_TABLES + 1)
+#define OPTION_LEADING_UNDERSCORE      (OPTION_NO_LEADING_UNDERSCORE + 1)
 #define OPTION_ENABLE_LONG_SECTION_NAMES \
                                        (OPTION_LEADING_UNDERSCORE + 1)
 #define OPTION_DISABLE_LONG_SECTION_NAMES \
                                        (OPTION_ENABLE_LONG_SECTION_NAMES + 1)
-/* DLLCharacteristics flags */
+/* DLLCharacteristics flags */
 #define OPTION_DYNAMIC_BASE            (OPTION_DISABLE_LONG_SECTION_NAMES + 1)
 #define OPTION_FORCE_INTEGRITY         (OPTION_DYNAMIC_BASE + 1)
 #define OPTION_NX_COMPAT               (OPTION_FORCE_INTEGRITY + 1)
@@ -268,6 +266,8 @@ fragment <<EOF
 #define OPTION_NO_BIND                 (OPTION_NO_SEH + 1)
 #define OPTION_WDM_DRIVER              (OPTION_NO_BIND + 1)
 #define OPTION_TERMINAL_SERVER_AWARE   (OPTION_WDM_DRIVER + 1)
+/* Determinism.  */
+#define OPTION_INSERT_TIMESTAMP                (OPTION_TERMINAL_SERVER_AWARE + 1)
 
 static void
 gld${EMULATION_NAME}_add_options
@@ -301,6 +301,7 @@ gld${EMULATION_NAME}_add_options
      OPTION_USE_NUL_PREFIXED_IMPORT_TABLES},
     {"no-leading-underscore", no_argument, NULL, OPTION_NO_LEADING_UNDERSCORE},
     {"leading-underscore", no_argument, NULL, OPTION_LEADING_UNDERSCORE},
+    {"insert-timestamp", no_argument, NULL, OPTION_INSERT_TIMESTAMP},
 #ifdef DLL_SUPPORT
     /* getopt allows abbreviations, so we do this to stop it
        from treating -o as an abbreviation for this option.  */
@@ -438,6 +439,8 @@ gld_${EMULATION_NAME}_list_options (FILE *file)
   fprintf (file, _("  --support-old-code                 Support interworking with old code\n"));
   fprintf (file, _("  --[no-]leading-underscore          Set explicit symbol underscore prefix mode\n"));
   fprintf (file, _("  --thumb-entry=<symbol>             Set the entry point to be Thumb <symbol>\n"));
+  fprintf (file, _("  --insert-timestamp                 Use a real timestamp rather than zero.\n"));
+  fprintf (file, _("                                     This makes binaries non-deterministic\n"));
 #ifdef DLL_SUPPORT
   fprintf (file, _("  --add-stdcall-alias                Export symbols with and without @nn\n"));
   fprintf (file, _("  --disable-stdcall-fixup            Don't link _sym to _sym@nn\n"));
@@ -754,6 +757,9 @@ gld${EMULATION_NAME}_handle_option (int optc)
     case OPTION_LEADING_UNDERSCORE:
       pe_leading_underscore = 1;
       break;
+    case OPTION_INSERT_TIMESTAMP:
+      insert_timestamp = TRUE;
+      break;
 #ifdef DLL_SUPPORT
     case OPTION_OUT_DEF:
       pe_out_def_filename = xstrdup (optarg);
@@ -1255,6 +1261,7 @@ gld_${EMULATION_NAME}_after_open (void)
   pe_data (link_info.output_bfd)->pe_opthdr = pe;
   pe_data (link_info.output_bfd)->dll = init[DLLOFF].value;
   pe_data (link_info.output_bfd)->real_flags |= real_flags;
+  pe_data (link_info.output_bfd)->insert_timestamp = insert_timestamp;
 
   /* At this point we must decide whether to use long section names
      in the output or not.  If the user hasn't explicitly specified
index 3e8b65e19a290d15a8a1d6cc26aa219f9222e719..b7388001df7576971c6236739c7d5a557b63d7b4 100644 (file)
@@ -18,8 +18,7 @@ esac
 rm -f e${EMULATION_NAME}.c
 (echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-)
 fragment <<EOF
-/* Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012
-   Free Software Foundation, Inc.
+/* Copyright 2006-2013 Free Software Foundation, Inc.
    Written by Kai Tietz, OneVision Software GmbH&CoKg.
 
    This file is part of the GNU Binutils.
@@ -146,6 +145,7 @@ static flagword real_flags = IMAGE_FILE_LARGE_ADDRESS_AWARE;
 static int support_old_code = 0;
 static lang_assignment_statement_type *image_base_statement = 0;
 static unsigned short pe_dll_characteristics = 0;
+static bfd_boolean insert_timestamp = FALSE;
 
 #ifdef DLL_SUPPORT
 static int    pep_enable_stdcall_fixup = 1; /* 0=disable 1=enable (default).  */
@@ -241,6 +241,7 @@ enum options
   OPTION_NO_SEH,
   OPTION_NO_BIND,
   OPTION_WDM_DRIVER,
+  OPTION_INSERT_TIMESTAMP,
   OPTION_TERMINAL_SERVER_AWARE
 };
 
@@ -316,6 +317,7 @@ gld${EMULATION_NAME}_add_options
     {"no-bind", no_argument, NULL, OPTION_NO_BIND},
     {"wdmdriver", no_argument, NULL, OPTION_WDM_DRIVER},
     {"tsaware", no_argument, NULL, OPTION_TERMINAL_SERVER_AWARE},
+    {"insert-timestamp", no_argument, NULL, OPTION_INSERT_TIMESTAMP},
     {NULL, no_argument, NULL, 0}
   };
 
@@ -402,6 +404,8 @@ gld_${EMULATION_NAME}_list_options (FILE *file)
   fprintf (file, _("  --subsystem <name>[:<version>]     Set required OS subsystem [& version]\n"));
   fprintf (file, _("  --support-old-code                 Support interworking with old code\n"));
   fprintf (file, _("  --[no-]leading-underscore          Set explicit symbol underscore prefix mode\n"));
+  fprintf (file, _("  --insert-timestamp                 Use a real timestamp rather than zero.\n"));
+  fprintf (file, _("                                     This makes binaries non-deterministic\n"));
 #ifdef DLL_SUPPORT
   fprintf (file, _("  --add-stdcall-alias                Export symbols with and without @nn\n"));
   fprintf (file, _("  --disable-stdcall-fixup            Don't link _sym to _sym@nn\n"));
@@ -707,6 +711,9 @@ gld${EMULATION_NAME}_handle_option (int optc)
     case OPTION_LEADING_UNDERSCORE:
       pep_leading_underscore = 1;
       break;
+    case OPTION_INSERT_TIMESTAMP:
+      insert_timestamp = TRUE;
+      break;
 #ifdef DLL_SUPPORT
     case OPTION_OUT_DEF:
       pep_out_def_filename = xstrdup (optarg);
@@ -1219,6 +1226,7 @@ gld_${EMULATION_NAME}_after_open (void)
   pe_data (link_info.output_bfd)->pe_opthdr = pep;
   pe_data (link_info.output_bfd)->dll = init[DLLOFF].value;
   pe_data (link_info.output_bfd)->real_flags |= real_flags;
+  pe_data (link_info.output_bfd)->insert_timestamp = insert_timestamp;
 
   /* At this point we must decide whether to use long section names
      in the output or not.  If the user hasn't explicitly specified
index e4788f67b57fd9866148dcb37969a2d6fd7e9c75..c925ecb3f98b9e5485b8504342fad19a1eb6e1d1 100644 (file)
@@ -2657,6 +2657,11 @@ The driver uses the MS Windows Driver Model.
 @item --tsaware
 The image is Terminal Server aware.
 
+@kindex --insert-timestamp
+@item --insert-timestamp
+Insert a real timestamp into the image, rather than the default value
+of zero.  This will result in a slightly different results with each
+invocation, which could be helpful for distributing unique images.
 @end table
 
 @c man end
index 7d5f90db92d69bd1465289fa57866f4f9280b6de..8777efb9b7c4029095059776e78eaf20902bd4a0 100644 (file)
@@ -1169,9 +1169,6 @@ fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
   unsigned char *enameptrs;
   unsigned char *eordinals;
   char *enamestr;
-  time_t now;
-
-  time (&now);
 
   edata_d = xmalloc (edata_sz);
 
@@ -1186,7 +1183,10 @@ fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
                   + edata_s->output_section->vma - image_base)
 
   memset (edata_d, 0, edata_sz);
-  bfd_put_32 (abfd, now, edata_d + 4);
+
+  if (pe_data (abfd)->insert_timestamp)
+    H_PUT_32 (abfd, time (0), edata_d + 4);
+
   if (pe_def_file->version_major != -1)
     {
       bfd_put_16 (abfd, pe_def_file->version_major, edata_d + 8);