From: Nick Clifton Date: Mon, 30 Mar 2020 15:30:02 +0000 (+0100) Subject: Fix objcopy's --preserve-dates command line option so that it will work with PE forma... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=00386881a3d0f7ac89fcc5cc912da8cd69c04324;p=binutils-gdb.git 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 --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 + + 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 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 + + 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 * 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 + + 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 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) {