2016-05-12 10 views
2

Warum führt die Ausführung von go build ./ bei einigen Projekten jedes Mal zu unterschiedlichen Ergebnissen?Warum ändert sich meine Go-Binärdatei bei jedem Neuaufbau?

Zum Beispiel:

$ cd go/src/github.com/google/cadvisor 
$ go build ./ 
$ sh1sum cadvisor 
cdfc3c38898e2decd5df35b661737f7cc4f514ed cadvisor 
$ go build ./ 
$ sha1sum cadvisor 
a94db96d684225e7a45cc68c5341fe6f57897c23 cadvisor 

Voll isoliert Setup:

$ go version 
go version go1.6.2 linux/amd64 
$ export GOPATH=$(mktemp -d) 
$ cd $GOPATH 
$ go get github.com/tools/godep 
$ go get github.com/google/cadvisor 
package github.com/influxdb/influxdb/client: code in directory /tmp/tmp.2MxFdNmdDe/src/github.com/influxdb/influxdb/client expects import "github.com/influxdata/influxdb/client" 
$ cd src/github.com/google/cadvisor 
$ $GOPATH/bin/godep restore 
godep: WARNING: Go version (go1.6) & $GO15VENDOREXPERIMENT= wants to enable the vendor experiment, but disabling because a Godep workspace (Godeps/_workspace) exists 
$ go build ./ 
... 
+0

Nie verwendet Go, aber ich vermute, dass das Verhalten absichtlich ist. Ich habe bereits an einem Ort gearbeitet, an dem wir jedes Mal, wenn wir eine kompilierte Win32-MFC-Anwendung erhalten, die Binärdatei absichtlich anders gemacht haben. Der Grund war, uns von der Verantwortung und Haftung freizustellen, wenn der Kunde den Quellcode anfragte, im möglichen Fall, dass er berührt wurde. Normalerweise würde es nicht passieren, da der Hauptgrund des Kunden die Quelle nicht beibehalten wollte, sondern im Falle unseres Konkurses die Softwarehersteller – sergiol

+0

Wenn es absichtlich Variationen zu den Builds gab, würde ich es erwarten sich immer ändern. Das ist jedoch nicht der Fall, da ein kleines "Hallo Welt" -Stil-Programm bei der Neukompilierung identische Binärdateien erzeugt. –

Antwort

2

Da Sie CGO verwenden, erstellt Go ein tmp-Verzeichnis, das zum Kompilieren des C-Codes verwendet wird, und der Pfad wird in die Binärdatei eingebettet.

Es gab ein Problem, aber ich kann es jetzt nicht finden.

Probleme 9206 und 13247.

0

1- Dies ist ein Beispielcode, der selbst Sie es baut jedes Mal ändert (auch wegen der eingebetteten __DATE__ und __TIME__, die auf ändern jeder Build):

package main 

/* 
#include<stdint.h> 
#include<string.h> 
void getCompileDateTime(uint8_t dt[12],uint8_t tm[9]){ 
    strcpy(dt, __DATE__); //Mmm dd yyyy 
    strcpy(tm, __TIME__); //hh:mm:ss 
} 
*/ 
import "C" 
import (
    "fmt" 
    "unsafe" 
) 

func main() { 
    dt := make([]byte, 12) 
    tm := make([]byte, 10) 
    C.getCompileDateTime((*C.uint8_t)(unsafe.Pointer(&dt[0])), (*C.uint8_t)(unsafe.Pointer(&tm[0]))) 
    dts, tms := string(dt), string(tm) 
    fmt.Println(dts, tms) 
} 

2-

einmal CGO verwendet wird, wird der binäre $ WORK Weg in den Zwergen Abschnitte
Aktuelle Probleme enthalten:
1. $ WORK Weg Leckage in CGO aufbaut.
2. $ WORK Weg Leckage in -cover und Tests.

ref: https://github.com/golang/go/issues/9206


3- ein reines Go-Programm Gebäude wird mehrmals identisch Binärdateien erzeugen.


Ich hoffe, das hilft.

Verwandte Themen