2016-05-12 91 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- 构建纯围棋程序多次将产生 相同的二进制文件。


我希望这有助于。

相关问题