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.
This commit is contained in:
Johannes Schauer Marin Rodrigues 2023-07-24 16:59:19 +01:00 committed by Nick Clifton
parent 4701770c57
commit 6badd1020f
7 changed files with 54 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2023-07-24 Johannes Schauer Marin Rodrigues <josch@debian.org>
* 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 <jose.marchesi@oracle.com>
* reloc.c: New reloc BFD_RELOC_BPF_DISPCALL32.

View File

@ -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);

View File

@ -1,3 +1,8 @@
2023-07-24 Johannes Schauer Marin Rodrigues <josch@debian.org>
* doc/binutils.texi (objcopy): Document change in behaviour of
objcopy's --preserve-dates command line option.
2023-07-09 Fangrui Song <maskray@google.com>
PR 30592

View File

@ -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

View File

@ -1,3 +1,10 @@
2023-07-24 Johannes Schauer Marin Rodrigues <josch@debian.org>
* 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 <nickc@redhat.com>
* configure: Regenerate.

View File

@ -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

View File

@ -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);