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 ++?
11
A
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
.
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
zar
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:
Co PWD =/proc/self/cwd zrobić? –
@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ść. –
Jakie są główne zastosowania losowości w GCC? –