Двоичная воспроизводимость в Visual C ++ - PullRequest
6 голосов
/ 01 сентября 2009

Есть ли способ заставить один и тот же код создавать один и тот же двоичный файл в Visual C ++? Отключить временную метку в PE или сделать так, чтобы временная метка в PE была фиксированной, другими словами?

Ответы [ 2 ]

4 голосов
/ 07 сентября 2009

Это не только временная метка - для сопоставления с PDB используется встроенный GUID - как объясняет Джон Роббинс .

Более того, нет никакого способа заставить компилятор генерировать согласованные результаты, как объясняет Джим Грисмер -

Авторы компиляторов гораздо больше заинтересованы в создании правильно функционирующего кода и его быстрой генерации, чем в том, чтобы все, что генерируется, было одинаково размещено на вашем жестком диске. Из-за многочисленных и разнообразных методов и реализаций для оптимизации кода всегда возможно, что одна сборка закончилась немного большим количеством времени, чтобы сделать что-то дополнительное или отличное от другой сборки. Таким образом, конечный результат может быть другим набором битов для той же функциональности.

Таким образом, порядок функций и секций не гарантированно будет последовательно упорядочен в результирующем PE. Пример по ссылке.

3 голосов
/ 01 сентября 2009

Полагаю, вы могли бы написать утилиту для открытия PE, установить контрольную сумму на 0, установить временную метку на то, что вам нравится, пересчитать crc, а затем выписать обратно. Было бы неплохо, если бы существовал официальный способ обеспечить идеальную двоичную воспроизводимость.

Для получения дополнительной информации: http://msdn.microsoft.com/en-us/magazine/cc301805.aspx

...