Ich arbeite in einer sehr regulierten Umgebung, in der wir in der Lage sein müssen, identische binäre Eingabe zu erzeugen, geben Sie den gleichen Quellcode jedes Mal wieder, wenn Produkte aufgebaut werden. Wir verwenden derzeit eine alte Version von g ++, die gepatcht wurde, um in den resultierenden Binärdateien, die sich von Build zu Build ändern würden, nichts wie ein Datum/eine Uhrzeit zu schreiben, aber ich würde gerne auf g ++ 4.7.2 aktualisieren. Kennt jemand einen Patch oder hat er Vorschläge, wonach ich suchen muss, um zwei identische Teile des Quellcodes zu erhalten und identische Binärausgaben zu erzeugen?Wie man deterministische binäre Ausgabe mit g ++ erzeugt?
11
A
Antwort
6
Wir sind auch auf Bit-identische Umbauten angewiesen und verwenden gcc-4.7.x.
Neben Einstellung PWD=/proc/self/cwd
und -frandom-seed=<input-file-name>
gibt es eine Handvoll Patches, die in svn://gcc.gnu.org/svn/gcc/branches/google/gcc-4_7
Zweig gefunden werden können.
5
Das Debian Reproducible builds project versucht, Debian-Pakete Byte für Byte zu standardisieren, und erhielt kürzlich eine Linux Foundation grant.
Während dies mehr als Kompilierung beinhalten kann, sollten Sie es sich ansehen.
Es zeigte mir auch this article, die folgenden Punkte ergänzt, was @Employed sagte:
- die Quelle in einem festen Ordner speichern (zB
/tmp/build
) mit__FILE__
- für
__DATE__
, beschäftigen__TIME__
,__TIMESTAMP__
:- libfaketime: https://github.com/wolfcw/libfaketime
- Überschreibung t Schlauch-Makros mit
-D
-Wdate-time
oder-Werror=date-time
: warnen oder fehlschlagen, wenn entweder__TIME__
,__DATE__
oder__TIMESTAMP__
verwendet wird. Der Linux-Kernel 4.4 verwendet es standardmäßig.
- verwenden, um die Flagge mit
D
ar
oder https://github.com/nh2/ar-timestamp-wiper/tree/master Stempel abzuwischen verwenden -fno-guess-branch-probability
: older manual versions sagen, dass es eine Quelle für nicht-Determinismus, aber not anymore. Nicht sicher, ob dies von-frandom-seed
abgedeckt wird oder nicht.
Buildroot hat eine BR2_REPRODUCIBLE
Option, die auf Paketebene einige Ideen geben kann, aber es ist bei weitem nicht vollständig an dieser Stelle.
Verwandte Themen:
Was PWD nicht =/proc/self/cwd tun? –
@StevenBehnke Wir bauen mit Debug-Info. Unter Linux speichert GCC 'PWD' (das die Shell auf das aktuelle Arbeitsverzeichnis setzt) als aktuelles Kompilierungsverzeichnis. Da wir wollen, dass Builds identisch sind, unabhängig davon, in welchem Verzeichnis der Build ausgeführt wurde, setzen wir 'PWD' auf einen vorhersagbaren Wert. –
Was sind die Hauptanwendungen von Zufälligkeit in GCC? –