This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH] Facilitate deterministic pe executables between linker invocations
- From: Cory Fields <cory at coryfields dot com>
- To: binutils at sourceware dot org
- Cc: Cory Fields <cory at coryfields dot com>
- Date: Tue, 1 Oct 2013 13:40:06 -0400
- Subject: [PATCH] Facilitate deterministic pe executables between linker invocations
- Authentication-results: sourceware.org; auth=none
I'm not sure if this has been discussed before, or exactly how to propose this
behavioral change, so I'm submitting this patch with the goal of starting a
discussion.
It's currently not possible to create two byte-exact exe's due to the timestamp
in the PE header. This does not match elf behavior, where successive runs can
produce the exact same binary.
Only a tiny change is needed to avoid the random result. An
(entirely arbitrary) value of 1 is hard-coded rather than using the current
timestamp.
Is there a historical reason for the non-deterministic behavior? If so, would
it be reasonable to add an option similar to enable-deterministic-archives to
disable it?
Before:
$ ~/dev/binutils/ld/ld-new -m i386pe -o test.exe <snip>
$ md5sum test.exe
d88f78cff7e0f6cf50f4be546c2b4189 test.exe
$ ~/dev/binutils/ld/ld-new -m i386pe -o test.exe <snip>
$ md5sum test.exe
7287892f03f067940b508db830cf85ac test.exe
After:
$ ~/dev/binutils/ld/ld-new -m i386pe -o test.exe <snip>
$ md5sum test.exe
fa0bf1a326b332f72f270ae060fa758c test.exe
$ ~/dev/binutils/ld/ld-new -m i386pe -o test.exe <snip>
$ md5sum test.exe
fa0bf1a326b332f72f270ae060fa758c test.exe
binutils/Changelog
10-01-2013 Cory Fields <cory@coryfields.com>
* bfd/peXXigen.c (_bfd_XXi_only_swap_filehdr_out): Use a constant rather
than a real timestamp in the PE header to ensure deterministic link
results when invoked with identical inputs.
---
bfd/peXXigen.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c
index d0f7a96..2d9f93c 100644
--- a/bfd/peXXigen.c
+++ b/bfd/peXXigen.c
@@ -793,7 +793,10 @@ _bfd_XXi_only_swap_filehdr_out (bfd * abfd, void * in, void * out)
H_PUT_16 (abfd, filehdr_in->f_magic, filehdr_out->f_magic);
H_PUT_16 (abfd, filehdr_in->f_nscns, filehdr_out->f_nscns);
- H_PUT_32 (abfd, time (0), filehdr_out->f_timdat);
+ /* use a constant for the timestamp to ensure deterministic results with
+ identical inputs */
+ H_PUT_32 (abfd, 1, filehdr_out->f_timdat);
+
PUT_FILEHDR_SYMPTR (abfd, filehdr_in->f_symptr,
filehdr_out->f_symptr);
H_PUT_32 (abfd, filehdr_in->f_nsyms, filehdr_out->f_nsyms);
--
1.8.1.2