为什么每次重建都会更改二进制文件?
问题描述:
为什么在某些项目上重新运行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 ./
...
答
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- 构建纯围棋程序多次将产生 相同的二进制文件。
我希望这有助于。
从未使用过,但我怀疑这种行为是故意的。我已经在一个地方工作过,每次我们得到一个编译好的Win32 MFC应用程序时,这个二进制文件就会有意地不同。原因是当客户请求源代码时,可能会触及我们的责任和责任。通常情况下不会发生这种情况,因为客户希望源代码的主要原因不是维护它,而是为了让我们破产,软件生产商 – sergiol
如果go是故意为构建添加变体,我会期望它总是改变。但情况并非如此,因为一个小的“hello world”风格的程序在重新编译时会产生相同的二进制文件。 –