2010-07-08 39 views
5

Tôi có câu hỏi về mã nhị phân nguồn trên Windows.Cùng một mã nguồn đơn giản, các mã nhị phân khác nhau trên Windows

#include <stdio.h> 

int main() 
{ 
    printf("Hello, world!\n"); 

    return 0; 
} 

Cùng một mã nguồn, tôi đã biên dịch hai lần trên Windows (VS 2008 Cmmand Prompt: "CL"), nhưng tôi có các tệp nhị phân khác nhau.

cl new.cpp 

Các bạn có thể cho tôi biết lý do và cách tránh điều đó không?

+1

Xem http://stackoverflow.com/questions/1221185/ các hệ thống giống nhau trên các hệ thống khác nhau và http://stackoverflow.com/questions/1277877/gcc-compiled-binaries-w-different-sizes - về cơ bản không có trình biên dịch nào đảm bảo các tệp nhị phân sẽ giống nhau. –

+1

Tại sao bạn cần các tệp nhị phân giống hệt nhau? – jalf

Trả lời

4

Dấu thời gian là một phần của định dạng PE. Bạn sẽ luôn nhận được các giá trị khác nhau bất kể biên dịch dưới dạng bản phát hành hay không.

+0

Làm cách nào để tránh điều đó? Có thể xóa dấu thời gian không? Bởi vì trong Linux, nếu tôi sử dụng g ++/gcc, các tệp nhị phân cuối cùng sẽ giống nhau. –

+2

@Peter: ELF (định dạng thực thi của Linux) không có trường dấu thời gian. Tại sao nó quan trọng nếu đầu ra là khác nhau? –

+0

@Billy: Bạn nói đúng là ELF có thể không có trường dấu thời gian. Nó chỉ là rất khó chịu mà cùng một mã nguồn khác nhau nhị phân. –

1

Bạn đã biên dịch bản phát hành chưa? Gỡ lỗi có dấu thời gian được tích hợp trong đó có thể thay đổi số tiền của bạn trên mỗi biên dịch

+0

Biên dịch theo hướng dẫn ở trên mang lại sự khác biệt chính xác 1 byte. LSB của dấu thời gian được nhúng. – mocj

1

Tôi googled, và tìm thấy một giải pháp giữa đường:

DUMPBIN /RAWDATA MyApp.EXE > first.txt 
DUMPBIN /RAWDATA MyApp.EXE > second.txt 

http://support.microsoft.com/kb/164151 Làm thế nào để so sánh hình ảnh nhị phân của cùng một dự án xây dựng

+0

Bạn cũng có thể làm việc xung quanh nó bằng cách đặt dấu thời gian cho cùng một giá trị trong cả hai tệp thực thi. –

Các vấn đề liên quan