2016-05-12 135 views
2

爲什麼在某些項目上重新運行go build ./每次都會產生不同的結果?爲什麼每次重建都會更改二進制文件?

例如:

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

全分離的設置:

$ 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

從未使用過,但我懷疑這種行爲是故意的。我已經在一個地方工作過,每次我們得到一個編譯好的Win32 MFC應用程序時,這個二進制文件就會有意地不同。原因是當客戶請求源代碼時,可能會觸及我們的責任和責任。通常情況下不會發生這種情況,因爲客戶希望源代碼的主要原因不是維護它,而是爲了讓我們破產,軟件生產商 – sergiol

+0

如果go是故意爲構建添加變體,我會期望它總是改變。但情況並非如此,因爲一個小的「hello world」風格的程序在重新編譯時會產生相同的二進制文件。 –

回答

2

這是因爲您正在使用CGO,Go創建了一個用於編譯C代碼的tmp目錄,並且該路徑被嵌入到二進制文件中。

有一個問題,但我現在找不到它。

問題920613247

0

1-這是每次建立它(也因爲嵌入式__DATE____TIME__其中更改的時間改變其自身的示例代碼每個版本):

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-

一旦CGO被使用時,二進制將包含$ WORK路徑在DWARF 部分
目前存在的問題:在CGO
1. $ WORK路徑泄漏的基礎之上。
2. $ WORK在封裝和測試中的路徑泄漏。

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


3- 構建純圍棋程序多次將產生 相同的二進制文件。


我希望這有助於。

相關問題