2009-02-24 15 views
5

Kiedy buduję projekt przy użyciu kompilatora C++, czy mogę się upewnić, że wygenerowany plik binarny nie zostanie zmieniony, jeśli nie wystąpiły żadne zmiany w kodzie źródłowym? Wygląda na to, że za każdym razem, gdy przekompiluję moje źródło, wpływa to na sumę kontrolną md5 binarnej. Czy czas kompilacji w jakiś sposób wpływa na produkowany plik binarny? Jak mogę uzyskać powtarzalne wyniki kompilacji?Powtarzalne generowanie kodu obiektowego C++

+1

Może to, czego potrzebujesz, to lepszy sposób na śledzenie wersji oprócz md5 pliku binarnego? –

+0

Do czego jest to potrzebne? – jalf

Odpowiedz

1

Użyj inkrementalnego systemu kompilacji - takiego jak make, aby zapewnić, że nie przekompilujesz kodu, jeśli źródło się nie zmieni.

Możliwe, że twój kompilator będzie mógł tworzyć identyczne pliki binarne z tego samego źródła - lub może nie - zależy to od kompilatora. Większość osadzi aktualny czas w wygenerowanym binarnie gdzieś.

+0

przyrostowe kompilacje mogą dołączać dodatkowe dane do plików obiektów, co spowoduje różnice. Zamiast tego możesz użyć nie przyrostowej kompilacji, która za każdym razem buduje od zera. Sprawdź ten artykuł MS: http://msdn.microsoft.com/en-us/library/4khtbfyf.aspx – tguclu

+0

@tguclu To jest inne znaczenie przyrostowe niż moje. Według mojej definicji przyrostowy system kompilacji nie ma znaczenia dla obiektów wyjściowych: są one odbudowywane tylko wtedy, gdy zmieniają się ich źródła. –

2

Podejrzewam, że będzie w dużym stopniu zależał od twojego toolchain i systemu operacyjnego. Na przykład, jeśli jeden z nagłówków plików wykonywalnych zawiera sygnaturę czasową, to zawsze znajdziesz wynik MD5, który jest inny.

Jaki jest końcowy rezultat, który próbujesz osiągnąć (np. Dlaczego tak ważne jest, że są identyczne) ...?

+0

Szukam odpowiedzi głównie w Visual Studio i Xcode/gcc. Odbudowujemy nasz produkt na co dzień. Chciałbym rzetelnie dowiedzieć się, jakie biblioteki DLL zmieniły się między dwiema kompilacjami. Czy mogę to zrobić, ustawiając niektóre flagi w kompilatorze/łączniku, aby nie używać informacji o znacznikach czasu podczas generowania plików binarnych? – user70336

+0

Nie tak daleko, jak wiem. – Sean

3

Można demontować pliki binarne i uruchomić MD5 na wyjściu

przykład na MacOSX

otool -tV a.out | md5 
ee2e724434a89fce96aa6b48621f7220 

Ale jeden zdobywa się na danych globalnych ... (może być parametrem zawierać zbyt)

ja odpowiadając na problemie md5 sprawdzania binarny ... jak zarządzać źródła i systemu budowania jak inni napisali o to również rzeczą patrzeć

2

Nie można wykonać porównania sumy kontrolnej md5 w studiu graficznym. W przypadku zwykłego pliku .exe wersji Release z Visual Studio będą trzy lokalizacje, które zmieniają się z każdym rekompilacją. 2 z nich to sygnatury czasowe, a trzecia to unikalny identyfikator GUID używany przez studio graficzne w celu dopasowania wersji pliku .exe do plików pomocniczych w celu zapewnienia ich synchronizacji.

Możliwe jest napisanie narzędzia, które wyzeruje 3 zmienne pola, ale nie jestem pewien, jak łatwo byłoby przeanalizować plik.

Ponadto, jeśli wywołasz jakiekolwiek pliki .dll, jeśli dobrze pamiętam, otrzymasz bardziej unikalne identyfikatory w wygenerowanym pliku.

Wersja debugowania to inna historia. Myślę, że istnieje wiele, wiele więcej różnic.