2013-02-01 6 views
11

Pracuję w bardzo regulowanym środowisku, w którym musimy być w stanie wyprodukować identyczne wejście binarne, podając ten sam kod źródłowy za każdym razem, gdy budujemy produkty. Obecnie używamy starszej wersji g ++, która została załatana, aby nie zapisywać niczego takiego jak data/czas w wynikowych plikach binarnych, które zmieniałyby się z wersji kompilacji na kompilację, ale chciałbym zaktualizować do wersji g ++ 4.7.2. Czy ktoś wie o łatce lub ma sugestie, czego potrzebuję, aby pobrać dwa identyczne fragmenty kodu źródłowego i wyprodukować identyczne wyjścia binarne?Jak wytworzyć deterministyczne wyjście binarne za pomocą g ++?

Odpowiedz

6

Jesteśmy również zależni od odbudowy identycznej z bitami i używamy gcc-4.7.x.

Poza ustawieniem PWD=/proc/self/cwd i użyciem -frandom-seed=<input-file-name>, istnieje garść łatek, które można znaleźć w gałęzi svn://gcc.gnu.org/svn/gcc/branches/google/gcc-4_7.

+0

Co PWD =/proc/self/cwd zrobić? –

+3

@StevenBehnke Budujemy z informacjami debugowania. W systemie Linux GCC nagrywa 'PWD' (który powłoka ustawia na bieżący katalog roboczy) jako bieżący katalog kompilacji. Ponieważ chcemy, aby kompilacje były identyczne jak bit, niezależnie od tego, w którym katalogu została wykonana kompilacja, ustawiamy "PWD" na przewidywalną wartość. –

+1

Jakie są główne zastosowania losowości w GCC? –

5

The Debian Reproducible builds project próbuje standaryzować pakiety Debiana bajt po bajcie, a ostatnio otrzymał Linux Foundation grant.

Chociaż może to obejmować więcej niż kompilację, powinieneś rzucić na nią okiem.

również wskazał mi this article, który dodaje się następujące punkty co @Employed powiedział:

  • umieścić źródło w ustalonym folderze (np /tmp/build) do czynienia z __FILE__
  • dla __DATE__, __TIME__ , __TIMESTAMP__:
    • libfaketime: https://github.com/wolfcw/libfaketime
    • T korekcja makra wąż -D
    • -Wdate-time lub -Werror=date-time: ostrzec lub nie jeśli jest stosowany zarówno __TIME__, __DATE__ lub __TIMESTAMP__. Jądro Linux 4.4 używa go domyślnie.
  • użyć flagi D z ar lub użyj https://github.com/nh2/ar-timestamp-wiper/tree/master wytrzeć znaczków
  • -fno-guess-branch-probability: older manual versions powiedzieć, że jest źródłem braku determinizmu, ale not anymore. Nie jestem pewien, czy jest to objęte przez -frandom-seed, czy też nie.

Buildroot ma BR2_REPRODUCIBLE opcji, która może dać kilka pomysłów na poziomie pakietu, ale jest daleki od zakończenia w tym momencie.

Podobne wątki:

Powiązane problemy