|
|
d1fe48 |
From 656e495d515b0fc1f01add164aa4bba9a49ceb31 Mon Sep 17 00:00:00 2001
|
|
|
d1fe48 |
From: Peter Jones <pjones@redhat.com>
|
|
|
d1fe48 |
Date: Tue, 13 Mar 2018 15:20:34 -0400
|
|
|
d1fe48 |
Subject: [PATCH 23/25] Call ar in deterministic mode.
|
|
|
d1fe48 |
|
|
|
d1fe48 |
We need the x86_64 and i686 builds of .a's to be the same, and that
|
|
|
d1fe48 |
means we need to not have timestamps. Also force the timestamps on disk
|
|
|
d1fe48 |
just in case that doesn't work, because RHEL's ar /silently ignores -D/.
|
|
|
d1fe48 |
|
|
|
d1fe48 |
v2: use "ar rvD" not "ar rv -D".
|
|
|
d1fe48 |
|
|
|
d1fe48 |
It's a wonder anybody ever gets these command line options right, if
|
|
|
d1fe48 |
"ar rv -D libfoo.a foo.o" doesn't use deterministic mode (or
|
|
|
d1fe48 |
complain), but "ar rvD libfoo.a foo.o" does.
|
|
|
d1fe48 |
|
|
|
d1fe48 |
v3: Add a bunch of junk to try to set timestamps to 0 manually
|
|
|
d1fe48 |
|
|
|
d1fe48 |
For some reason I'm still getting timestamps in the .a even though ar seems to
|
|
|
d1fe48 |
be invoked correctly. When I do "mock -r rhel-7-build --shell" and run make
|
|
|
d1fe48 |
manually, they're fine. Very strange.
|
|
|
d1fe48 |
|
|
|
d1fe48 |
v4: go back to v2, the problem isn't in the make process.
|
|
|
d1fe48 |
|
|
|
d1fe48 |
"ar rDv" works just fine, but /usr/lib/rpm/redhat/brp-strip-static-archive is
|
|
|
d1fe48 |
calling "%{__strip} -g $for_each.a", and it's rewriting our binary from
|
|
|
d1fe48 |
ts/uid/gid of 0/0/0 to $epoch/$UID/$GID. Awesomely /usr/bin/strip it seems to
|
|
|
d1fe48 |
have 3 modes of operation:
|
|
|
d1fe48 |
-U: the default, which adds $epoch/$UID/$GID to your binary archive
|
|
|
d1fe48 |
instead of just removing stuff. Clearly the Principle of Least
|
|
|
d1fe48 |
Surprise is strong here.
|
|
|
d1fe48 |
-p: preserve the timestamp from the original .a, but add UID and GID,
|
|
|
d1fe48 |
because this is 1980 and people use ar(1) for archiving stuff they
|
|
|
d1fe48 |
might want that out of.
|
|
|
d1fe48 |
-D: Condescend at you in a command line error and explain that -D both
|
|
|
d1fe48 |
is and is not a valid option:
|
|
|
d1fe48 |
/usr/bin/strip: invalid option -- 'D'
|
|
|
d1fe48 |
Usage: /usr/bin/strip <option(s)> in-file(s)
|
|
|
d1fe48 |
Removes symbols and sections from files
|
|
|
d1fe48 |
The options are:
|
|
|
d1fe48 |
...
|
|
|
d1fe48 |
-D --enable-deterministic-archives
|
|
|
d1fe48 |
Produce deterministic output when stripping archives
|
|
|
d1fe48 |
So I agree that it's invalid, but I think we may be pronouncing that
|
|
|
d1fe48 |
second vowel differently. They say in-VAL-id, I say IN-vuh-lid.
|
|
|
d1fe48 |
|
|
|
d1fe48 |
Nobody should ever have to run "strace -ttt -v -f -o make.strace make all",
|
|
|
d1fe48 |
just to discover the problem isn't even in there.
|
|
|
d1fe48 |
|
|
|
d1fe48 |
Related: rhbz#1310782
|
|
|
d1fe48 |
|
|
|
d1fe48 |
Signed-off-by: Peter Jones <pjones@redhat.com>
|
|
|
d1fe48 |
Signed-off-by: Nigel Croxon <ncroxon@redhat.com>
|
|
|
d1fe48 |
---
|
|
|
d1fe48 |
Make.defaults | 2 +-
|
|
|
d1fe48 |
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
d1fe48 |
|
|
|
d1fe48 |
diff --git a/Make.defaults b/Make.defaults
|
|
|
d1fe48 |
index ed4b60c2423..ba743f17893 100755
|
|
|
d1fe48 |
--- a/Make.defaults
|
|
|
d1fe48 |
+++ b/Make.defaults
|
|
|
d1fe48 |
@@ -177,7 +177,7 @@ CFLAGS += $(ARCH3264) -g -O2 -Wall -Wextra -Werror \
|
|
|
d1fe48 |
$(if $(findstring gcc,$(CC)),-fno-merge-all-constants,)
|
|
|
d1fe48 |
endif
|
|
|
d1fe48 |
|
|
|
d1fe48 |
-ARFLAGS += -U
|
|
|
d1fe48 |
+ARFLAGS := rDv
|
|
|
d1fe48 |
ASFLAGS += $(ARCH3264)
|
|
|
d1fe48 |
LDFLAGS += -nostdlib --warn-common --no-undefined --fatal-warnings \
|
|
|
d1fe48 |
--build-id=sha1
|
|
|
d1fe48 |
--
|
|
|
d1fe48 |
2.15.0
|
|
|
d1fe48 |
|