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:
Powiązane problemy
- 1. g ++ -E wyjście opcji
- 2. Wyjście Thor & YAML jako binarne?
- 3. Jak wektoryzować moją pętlę za pomocą g ++?
- 4. Python 2.x - Napisz wyjście binarne na standardowe wyjście?
- 5. Drzewo binarne za pomocą PHP + MySQL
- 6. Przeprowadź testy ScalaCheck deterministyczne
- 7. Kompilacja dynamicznej biblioteki współdzielonej za pomocą g ++
- 8. Jak rozpoznać pliki binarne i tekstowe za pomocą języka Python?
- 9. Jak wysłać dane binarne za pomocą żądania HTTP za pomocą klejnotu Ruby?
- 10. Wyczyść wyjście zespołu x86_64 za pomocą gcc?
- 11. Ubuntu: Jak połączyć binarne
- 12. Konwertuj dane binarne na base64 za pomocą javascript
- 13. Pobierz dane binarne jako plik za pomocą kodu JavaScript
- 14. Pliki binarne HTTP POST za pomocą Pythona: zwięzłe przykłady nieprzypisane?
- 15. Czy mogę poprawnie odczytać dane binarne za pomocą XDomainRequest?
- 16. Jak utworzyć drzewo binarne
- 17. Odtwarzanie binarne w Visual C++
- 18. Jak mogę lepiej zrozumieć wyszukiwanie binarne za pomocą jednego porównania za każdą z iteracji?
- 19. Komunikat o błędzie: „setw nie jest zdefiniowana” za pomocą g ++
- 20. Wyjście g ++: plik nie został rozpoznany: nie rozpoznano formatu pliku
- 21. Jak liczyć liczbę słów z ciągu za pomocą powłoki
- 22. Używając Lens, jak skomponować setter z inną funkcją g tak, że wyjście g jest nową wartością do ustawienia?
- 23. Wyjście z trybu pełnoekranowego za pomocą znacznika wideo HTML5
- 24. Deterministyczne strumienie liczb losowych w C++ STL
- 25. Dlaczego \ G w SELECT * FROM nazwa_tabeli \ G?
- 26. Jak odwrócić wyjście sed?
- 27. Jak zrobić wyjście GCC na standardowe wyjście?
- 28. Jak sortować du -h wyjście?
- 29. Jak mogę wstawić dane binarne do binarnego pola SQL za pomocą prostej instrukcji wstawiania?
- 30. Jak mogę uzyskać dane binarne plików z repozytorium Git za pomocą LibGit2Sharp?
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? –