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.
This commit is contained in:
Nick Clifton 2020-03-30 16:30:02 +01:00
parent 227c0bf4b3
commit 00386881a3
11 changed files with 55 additions and 8 deletions

View File

@ -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> 2020-03-30 Alan Modra <amodra@gmail.com>
PR 25745 PR 25745

View File

@ -128,7 +128,9 @@ typedef struct pe_tdata
int has_reloc_section; int has_reloc_section;
int dont_strip_reloc; int dont_strip_reloc;
int dos_message[16]; 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 *); bfd_boolean (*in_reloc_p) (bfd *, reloc_howto_type *);
flagword real_flags; flagword real_flags;

View File

@ -132,7 +132,9 @@ typedef struct pe_tdata
int has_reloc_section; int has_reloc_section;
int dont_strip_reloc; int dont_strip_reloc;
int dos_message[16]; 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 *); bfd_boolean (*in_reloc_p) (bfd *, reloc_howto_type *);
flagword real_flags; flagword real_flags;

View File

@ -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 /* Use a real timestamp by default, unless the no-insert-timestamp
option was chosen. */ 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); H_PUT_32 (abfd, time (0), filehdr_out->f_timdat);
else 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, PUT_FILEHDR_SYMPTR (abfd, filehdr_in->f_symptr,
filehdr_out->f_symptr); filehdr_out->f_symptr);

View File

@ -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> 2020-03-28 Alan Modra <amodra@gmail.com>
* testsuite/binutils-all/objcopy.exp (objcopy_test): Only * testsuite/binutils-all/objcopy.exp (objcopy_test): Only

View File

@ -2774,6 +2774,11 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
file_alignment, section_alignment); 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) if (isympp)

View File

@ -76,7 +76,7 @@ proc objcopy_test {testname srcfile type asflags ldflags} {
unresolved "objcopy $type ($testname)" unresolved "objcopy $type ($testname)"
return return
} }
set xflags "-p" set xflags "--preserve-dates"
} }
set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS $xflags $t_tempfile $t_copyfile"] set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS $xflags $t_tempfile $t_copyfile"]

View File

@ -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> 2020-03-28 H.J. Lu <hongjiu.lu@intel.com>
PR 25732 PR 25732

View File

@ -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)->pe_opthdr = pe;
pe_data (link_info.output_bfd)->dll = init[DLLOFF].value; 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)->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 /* At this point we must decide whether to use long section names
in the output or not. If the user hasn't explicitly specified in the output or not. If the user hasn't explicitly specified

View File

@ -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)->pe_opthdr = pep;
pe_data (link_info.output_bfd)->dll = init[DLLOFF].value; 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)->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 /* At this point we must decide whether to use long section names
in the output or not. If the user hasn't explicitly specified in the output or not. If the user hasn't explicitly specified

View File

@ -1211,8 +1211,10 @@ fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
memset (edata_d, 0, edata_sz); 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); 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) if (pe_def_file->version_major != -1)
{ {