2009-06-29 16 views

Odpowiedz

7

Data kompilacji jest zawarta w wersji, zobacz startowych version.c:

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

i UTS_VERSION jest zdefiniowana w include/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 są generowane przez skrypty/mkcompile_h, gdzie można znaleźć następującą linię:

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

Po usunięciu date z linii przeczącej powinieneś być w stanie pozbyć się zależności czasu kompilacji.

0

Najszybszym sposobem sprawdzenia byłoby zrobienie, wykonanie kopii, oczyszczenie, a następnie ponowne wykonanie. Jeśli suma kontrolna jest zgodna, to jest możliwa. Jeśli nie, to sugeruje to, że Make modyfikuje niektóre pliki źródłowe w jakiś sposób (numeracja kompilacji, data kompilacji itp.).

0

Prawdopodobnie budowanie jądra w tym samym środowisku da taką samą sumę kontrolną. Tak więc ten sam kompilator (ta sama wersja tego samego kompilatora), dokładnie to samo źródło, te same zależności (jeśli to dotyczy nawet kompilacji jądra), itp.

+0

Nawet z dokładnie tą samą konfiguracją środowiska (te same źródła, ten sam kompilator i te same zależności), dwie kolejne kompilacje dają inną sumę kontrolną. Myślę, że problem dotyczy opcji kompilacji i nie wiem, które opcje kompilacji można zmienić, aby uzyskać tę samą sumę kontrolną bez modyfikowania poprawności jądra. – gsempe

1

Nawet prosty świat hello skompilowany dwukrotnie powoduje różne pliki binarne. W jakiś sposób linker dodaje pewne informacje, które zmieniają się w każdej kompilacji.

+0

Czy to nadal prawda, gdy wynikowy plik binarny jest usuwany? – shodanex

5

Odpowiedź shodanex jest słuszna, ale niekompletna. Po kilku badaniach znalazłem binaria jądra Linuksa osadzające domyślne ramfy, co jest kolejnym powodem różnic między kompilacjami jądra (data osadzenia nagłówka CPIO RAMFS). Nie można wyłączyć tej funkcji, ale możliwe jest podanie domyślnych ramfów. Po wykonaniu tej czynności otrzymasz dokładnie taką samą sumę kontrolną.

Dziękuję. Twoje odpowiedzi bardzo mi pomogą rozwiązać mój problem.

2

@ gsempe, chciałbyś poszukać tego: "Ustaw deterministyczny kernel" ref. http://lwn.net/Articles/437864/

możliwe jest, aby pozbyć się niektórych źródeł hałasu (hałas ... jest w oku patrzącego ;-)

+0

Świetny dodatek, ale rozwiązałem mój problem. Sprawdź tutaj http://stackoverflow.com/a/1214926/21052 – gsempe

Powiązane problemy