2013-02-01 14 views
11

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?

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.

+0

Was PWD nicht =/proc/self/cwd tun? –

+3

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

+1

Was sind die Hauptanwendungen von Zufälligkeit in GCC? –

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 Dar 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: