From 6badd1020f5bebd3f60a780b8e41a1b581046087 Mon Sep 17 00:00:00 2001 From: Johannes Schauer Marin Rodrigues Date: Mon, 24 Jul 2023 16:59:19 +0100 Subject: [PATCH] objcopy embeds the current time and ignores SOURCE_DATE_EPOCH making the output unreproducible. bfd * peXXigen.c (_bfd_XXi_only_swap_filehdr_out): If inserting a timestamp, use the value held in the SOURCE_DATE_EPOCH environment variable, if it is defined. binutils * doc/binutils.texi (objcopy): Document change in behaviour of objcopy's --preserve-dates command line option. ld * pe-dll.c (fill_edata): If inserting a timestamp, use the value held in the SOURCE_DATE_EPOCH environment variable, if it is defined. * ld.texi (--insert-timestamp): Document change in behaviour. --- bfd/ChangeLog | 6 ++++++ bfd/peXXigen.c | 15 ++++++++++++++- binutils/ChangeLog | 5 +++++ binutils/doc/binutils.texi | 5 +++++ ld/ChangeLog | 7 +++++++ ld/ld.texi | 5 +++++ ld/pe-dll.c | 13 ++++++++++++- 7 files changed, 54 insertions(+), 2 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index db032df5ac2..56c858e6ce4 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2023-07-24 Johannes Schauer Marin Rodrigues + + * peXXigen.c (_bfd_XXi_only_swap_filehdr_out): If inserting a + timestamp, use the value held in the SOURCE_DATE_EPOCH environment + variable, if it is defined. + 2023-07-24 Jose E. Marchesi * reloc.c: New reloc BFD_RELOC_BPF_DISPCALL32. diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c index da53f349dd0..cdd89f80330 100644 --- a/bfd/peXXigen.c +++ b/bfd/peXXigen.c @@ -838,7 +838,20 @@ _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)->timestamp) == -1) - H_PUT_32 (abfd, time (0), filehdr_out->f_timdat); + { + time_t now; + char *source_date_epoch; + + /* If the SOURCE_DATE_EPOCH environment variable is + defined then use that as the time, otherwise use + the current time. */ + source_date_epoch = getenv ("SOURCE_DATE_EPOCH"); + if (source_date_epoch) + now = (time_t) strtoll (source_date_epoch, NULL, 10); + else + now = time (NULL); + H_PUT_32 (abfd, now, filehdr_out->f_timdat); + } else H_PUT_32 (abfd, pe_data (abfd)->timestamp, filehdr_out->f_timdat); diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 097673f783e..cfd4d1ad45e 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,8 @@ +2023-07-24 Johannes Schauer Marin Rodrigues + + * doc/binutils.texi (objcopy): Document change in behaviour of + objcopy's --preserve-dates command line option. + 2023-07-09 Fangrui Song PR 30592 diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi index 309bedf6110..9f80f398c9d 100644 --- a/binutils/doc/binutils.texi +++ b/binutils/doc/binutils.texi @@ -1626,6 +1626,11 @@ commands. If the input was '12345678' then the outputs would be Set the access and modification dates of the output file to be the same as those of the input file. +This option also copies the date stored in a PE format file's header, +unless the SOURCE_DATE_EPOCH environment variable is defined. If it +is defined then this variable will be used as the date stored in the +header, interpreted as the number of seconds since the Unix epoch. + @item -D @itemx --enable-deterministic-archives @cindex deterministic archives diff --git a/ld/ChangeLog b/ld/ChangeLog index 27988491efd..99029f1e186 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,10 @@ +2023-07-24 Johannes Schauer Marin Rodrigues + + * pe-dll.c (fill_edata): If inserting a timestamp, use the value + held in the SOURCE_DATE_EPOCH environment variable, if it is + defined. + * ld.texi (--insert-timestamp): Document change in behaviour. + 2023-07-03 Nick Clifton * configure: Regenerate. diff --git a/ld/ld.texi b/ld/ld.texi index 75e82eda004..24e9debfb5f 100644 --- a/ld/ld.texi +++ b/ld/ld.texi @@ -3571,6 +3571,11 @@ can be used to insert a zero value for the timestamp, this ensuring that binaries produced from identical sources will compare identically. +If @option{--insert-timestamp} is active then the time inserted is +either the time that the linking takes place or, if the +@code{SOURCE_DATE_EPOCH} environment variable is defined, the number +of seconds since Unix epoch as specified by that variable. + @kindex --enable-reloc-section @item --enable-reloc-section @itemx --disable-reloc-section diff --git a/ld/pe-dll.c b/ld/pe-dll.c index 02e03d16948..a95b85c60dd 100644 --- a/ld/pe-dll.c +++ b/ld/pe-dll.c @@ -1231,7 +1231,18 @@ fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED) memset (edata_d, 0, edata_sz); if (pe_data (abfd)->timestamp == -1) - H_PUT_32 (abfd, time (0), edata_d + 4); + { + time_t now; + char *source_date_epoch; + + source_date_epoch = getenv ("SOURCE_DATE_EPOCH"); + if (source_date_epoch) + now = (time_t) strtoll (source_date_epoch, NULL, 10); + else + now = time (NULL); + + H_PUT_32 (abfd, now, edata_d + 4); + } else H_PUT_32 (abfd, pe_data (abfd)->timestamp, edata_d + 4); -- 2.30.2