[binutils-gdb] Fix objcopy's --preserve-dates command line option so that it will work with PE format files.

Nick Clifton nickc@sourceware.org
Mon Mar 30 15:31:21 GMT 2020


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=00386881a3d0f7ac89fcc5cc912da8cd69c04324

commit 00386881a3d0f7ac89fcc5cc912da8cd69c04324
Author: Nick Clifton <nickc@redhat.com>
Date:   Mon Mar 30 16:30:02 2020 +0100

    Fix objcopy's --preserve-dates command line option so that it will work with PE format files.
    
            PR binutils/pr25662
    bfd     * libcoff-in.h (struct pe_tdata): Rename the insert_timestamp
            field to timestamp and make it an integer.
            * libcoff.h: Regenerate.
            * peXXigen.c (_bfd_XXi_only_swap_filehdr_out): Test the timestamp
            field in the pe_data structure rather than the insert_timestamp
            field.
    
    binutils* objcopy.c (copy_object): When copying PE format files set the
            timestamp field in the pe_data structure if the preserve_dates
            flag is set.
            * testsuite/binutils-all/objcopy.exp (objcopy_test) Use
            --preserve-dates in place of the -p option, in order to make its
            effect more obvious.
    
    ld      * emultempl/pe.em (after_open): Replace initialisation of the
            insert_timestamp field in the pe_data structure with an
            initialisation of the timestamp field.
            * emultemp/pep.em: Likewise.
            * pe-dll.c (fill_edata): Use the timestamp field in the pe_data
            structure instead of the insert_timestamp field.

Diff:
---
 bfd/ChangeLog                               | 10 ++++++++++
 bfd/libcoff-in.h                            |  4 +++-
 bfd/libcoff.h                               |  4 +++-
 bfd/peXXigen.c                              |  4 ++--
 binutils/ChangeLog                          | 10 ++++++++++
 binutils/objcopy.c                          |  5 +++++
 binutils/testsuite/binutils-all/objcopy.exp |  2 +-
 ld/ChangeLog                                | 10 ++++++++++
 ld/emultempl/pe.em                          |  5 ++++-
 ld/emultempl/pep.em                         |  5 ++++-
 ld/pe-dll.c                                 |  4 +++-
 11 files changed, 55 insertions(+), 8 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index d17767fd7a9..bd43b676ba1 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,13 @@
+2020-03-30  Nick Clifton  <nickc@redhat.com>
+
+	PR binutils/pr25662
+	* libcoff-in.h (struct pe_tdata): Rename the insert_timestamp
+	field to timestamp and make it an integer.
+	* libcoff.h: Regenerate.
+	* peXXigen.c (_bfd_XXi_only_swap_filehdr_out): Test the timestamp
+	field in the pe_data structure rather than the insert_timestamp
+	field.
+
 2020-03-30  Alan Modra  <amodra@gmail.com>
 
 	PR 25745
diff --git a/bfd/libcoff-in.h b/bfd/libcoff-in.h
index 3030a65fa77..c86ffc99330 100644
--- a/bfd/libcoff-in.h
+++ b/bfd/libcoff-in.h
@@ -128,7 +128,9 @@ typedef struct pe_tdata
   int has_reloc_section;
   int dont_strip_reloc;
   int dos_message[16];
-  bfd_boolean insert_timestamp;
+  /* The timestamp to insert into the output file.
+     If the timestamp is -1 then the current time is used.  */
+  int timestamp;
   bfd_boolean (*in_reloc_p) (bfd *, reloc_howto_type *);
   flagword real_flags;
 
diff --git a/bfd/libcoff.h b/bfd/libcoff.h
index 4c7be6e935a..eeb7b6b9954 100644
--- a/bfd/libcoff.h
+++ b/bfd/libcoff.h
@@ -132,7 +132,9 @@ typedef struct pe_tdata
   int has_reloc_section;
   int dont_strip_reloc;
   int dos_message[16];
-  bfd_boolean insert_timestamp;
+  /* The timestamp to insert into the output file.
+     If the timestamp is -1 then the current time is used.  */
+  int timestamp;
   bfd_boolean (*in_reloc_p) (bfd *, reloc_howto_type *);
   flagword real_flags;
 
diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c
index e42d646552a..b9eeb775d9b 100644
--- a/bfd/peXXigen.c
+++ b/bfd/peXXigen.c
@@ -876,10 +876,10 @@ _bfd_XXi_only_swap_filehdr_out (bfd * abfd, void * in, void * out)
 
   /* Use a real timestamp by default, unless the no-insert-timestamp
      option was chosen.  */
-  if ((pe_data (abfd)->insert_timestamp))
+  if ((pe_data (abfd)->timestamp) == -1)
     H_PUT_32 (abfd, time (0), filehdr_out->f_timdat);
   else
-    H_PUT_32 (abfd, 0, filehdr_out->f_timdat);
+    H_PUT_32 (abfd, pe_data (abfd)->timestamp, filehdr_out->f_timdat);
 
   PUT_FILEHDR_SYMPTR (abfd, filehdr_in->f_symptr,
 		      filehdr_out->f_symptr);
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index c7c2d73fb72..a08be238790 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,13 @@
+2020-03-30  Nick Clifton  <nickc@redhat.com>
+
+	PR binutils/25662
+	* objcopy.c (copy_object): When copying PE format files set the
+	timestamp field in the pe_data structure if the preserve_dates
+	flag is set.
+	* testsuite/binutils-all/objcopy.exp (objcopy_test) Use
+	--preserve-dates in place of the -p option, in order to make its
+	effect more obvious.
+
 2020-03-28  Alan Modra  <amodra@gmail.com>
 
 	* testsuite/binutils-all/objcopy.exp (objcopy_test): Only
diff --git a/binutils/objcopy.c b/binutils/objcopy.c
index e6711a99fb2..738ef4c2c91 100644
--- a/binutils/objcopy.c
+++ b/binutils/objcopy.c
@@ -2774,6 +2774,11 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
 
 		     file_alignment, section_alignment);
 	}
+
+      if (preserve_dates
+	  && bfd_get_flavour (ibfd) == bfd_target_coff_flavour
+	  && bfd_pei_p (ibfd))
+	pe->timestamp = pe_data (ibfd)->coff.timestamp;
     }
 
   if (isympp)
diff --git a/binutils/testsuite/binutils-all/objcopy.exp b/binutils/testsuite/binutils-all/objcopy.exp
index e4eb53cf84a..56a7db8199b 100644
--- a/binutils/testsuite/binutils-all/objcopy.exp
+++ b/binutils/testsuite/binutils-all/objcopy.exp
@@ -76,7 +76,7 @@ proc objcopy_test {testname srcfile type asflags ldflags} {
 	    unresolved "objcopy $type ($testname)"
 	    return
 	}
-	set xflags "-p"
+	set xflags "--preserve-dates"
     }
 
     set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS $xflags $t_tempfile $t_copyfile"]
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 1227113d00c..15d34bc5a3f 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,13 @@
+2020-03-30  Nick Clifton  <nickc@redhat.com>
+
+	PR binutils/25662
+	* emultempl/pe.em (after_open): Replace initialisation of the
+	insert_timestamp field in the pe_data structure with an
+	initialisation of the timestamp field.
+	* emultemp/pep.em: Likewise.
+	* pe-dll.c (fill_edata): Use the timestamp field in the pe_data
+	structure instead of the insert_timestamp field.
+
 2020-03-28  H.J. Lu  <hongjiu.lu@intel.com>
 
 	PR 25732
diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em
index db23b221d66..4fe195ec32a 100644
--- a/ld/emultempl/pe.em
+++ b/ld/emultempl/pe.em
@@ -1375,7 +1375,10 @@ 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;
+  if (insert_timestamp)
+    pe_data (link_info.output_bfd)->timestamp = -1;
+  else
+    pe_data (link_info.output_bfd)->timestamp = 0;
 
   /* At this point we must decide whether to use long section names
      in the output or not.  If the user hasn't explicitly specified
diff --git a/ld/emultempl/pep.em b/ld/emultempl/pep.em
index 3d09a0a6b13..3e03eb3a6e0 100644
--- a/ld/emultempl/pep.em
+++ b/ld/emultempl/pep.em
@@ -1364,7 +1364,10 @@ 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;
+  if (insert_timestamp)
+    pe_data (link_info.output_bfd)->timestamp = -1;
+  else
+    pe_data (link_info.output_bfd)->timestamp = 0;
 
   /* At this point we must decide whether to use long section names
      in the output or not.  If the user hasn't explicitly specified
diff --git a/ld/pe-dll.c b/ld/pe-dll.c
index 397af8780e4..0addde23186 100644
--- a/ld/pe-dll.c
+++ b/ld/pe-dll.c
@@ -1211,8 +1211,10 @@ fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
 
   memset (edata_d, 0, edata_sz);
 
-  if (pe_data (abfd)->insert_timestamp)
+  if (pe_data (abfd)->timestamp == -1)
     H_PUT_32 (abfd, time (0), edata_d + 4);
+  else
+    H_PUT_32 (abfd, pe_data (abfd)->timestamp, edata_d + 4);
 
   if (pe_def_file->version_major != -1)
     {


More information about the Binutils-cvs mailing list