2009-06-29 29 views
6

Tôi đang tìm kiếm nếu nó có thể xây dựng cùng một Kerneltwice Linux (cùng một nguồn, cùng một môi trường, cùng một tùy chọn, cùng một trình biên dịch) và có được checksum cùng. Có ai biết cách làm như vậy không?Làm thế nào để xây dựng cùng một hạt nhân Linux hai lần nguồn và nhận được cùng một checksum

+0

Edition của @RamenChef không thực hiện bất kỳ cảm giác ... Có thực sự StackOverflow có thể đang trở nên quá tệ? – gsempe

Trả lời

7

Ngày xây dựng được bao gồm trong phiên bản, xem init version.c:

const char linux_banner[] = 
    "Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@" 
    LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n"; 

và UTS_VERSION được định nghĩa trong bao gồm/linux/compile.h:

/* This file is auto generated, version 1 */ 
/* PREEMPT */ 
#define UTS_MACHINE "arm" 
#define UTS_VERSION "#1 PREEMPT Mon Jun 29 10:49:17 CEST 2009" 
#define LINUX_COMPILE_TIME "10:49:17" 
#define LINUX_COMPILE_BY "cynove" 
#define LINUX_COMPILE_HOST "jp" 
#define LINUX_COMPILE_DOMAIN "evonyc" 
#define LINUX_COMPILER "gcc version 4.3.2 (crosstool-NG-1.4.0) " 

compile.h được tạo ra bởi kịch bản/mkcompile_h, nơi bạn tìm thấy những dòng sau:

UTS_VERSION="$UTS_VERSION $CONFIG_FLAGS `LC_ALL=C LANG=C date`" 

Bằng cách xóa date khỏi đường truyền, bạn sẽ có thể loại bỏ phụ thuộc thời gian xây dựng.

0

Cách nhanh nhất để kiểm tra sẽ là tạo, sao chép, làm sạch và sau đó thực hiện lại. Nếu kiểm tra phù hợp, sau đó nó có thể. Nếu không thì điều đó gợi ý rằng Make đang thay đổi một số tệp nguồn theo cách nào đó (xây dựng đánh số, xây dựng ngày, v.v ...)

0

Có lẽ, xây dựng hạt nhân trong cùng một môi trường sẽ dẫn đến cùng một kiểm tra. Vì vậy, cùng một trình biên dịch (cùng một phiên bản của cùng một trình biên dịch), chính xác cùng một nguồn, cùng một phụ thuộc (nếu điều đó có thể áp dụng cho biên dịch hạt nhân), v.v.

+0

Ngay cả với chính xác cùng một thiết lập môi trường (cùng một nguồn, cùng một trình biên dịch và cùng một phụ thuộc), hai bản kế tiếp tạo ra một tổng kiểm tra khác nhau. Tôi nghĩ rằng vấn đề là xung quanh tùy chọn biên dịch và tôi không biết tùy chọn biên dịch nào có thể thay đổi để có được cùng một kiểm tra mà không sửa đổi độ chính xác của hạt nhân. – gsempe

1

Ngay cả một thế giới chào đơn giản được biên dịch hai lần dẫn đến các tệp nhị phân khác nhau. Bằng cách nào đó, người liên kết đang thêm một số thông tin thay đổi trong mỗi bản dựng.

+0

Điều đó vẫn đúng khi kết quả nhị phân bị tước? – shodanex

5

câu trả lời của shodanex là đúng nhưng không đầy đủ. Sau khi một số nghiên cứu tôi tìm thấy Linux kernel nhị phân nhúng một ramfs mặc định đó là một lý do khác biệt giữa hai nhân biên dịch (CPIO RAMFS header embeds date). Không thể tắt tính năng này nhưng có thể cung cấp ramfs mặc định. Khi bạn làm như vậy, bạn nhận được chính xác cùng một tổng kiểm tra.

Cảm ơn bạn. Câu trả lời của bạn giúp tôi rất nhiều để giải quyết vấn đề của tôi.

2

@gsempe, bạn muốn tìm kiếm điều này: "Đặt kernel build deterministic" ref. http://lwn.net/Articles/437864/

nó có thể để thoát khỏi nguồn nhất định của tiếng ồn (tiếng ồn là ... trong mắt của kẻ si tình ;-)

+0

Ngoài ra tuyệt vời nhưng tôi đã giải quyết được vấn đề của mình. Hãy xem tại đây http://stackoverflow.com/a/1214926/21052 – gsempe

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