为了账号安全,请及时绑定邮箱和手机立即绑定

为什么每次重建时我的 go 二进制文件都会发生变化?

为什么每次重建时我的 go 二进制文件都会发生变化?

Go
慕无忌1623718 2022-01-10 15:14:39
为什么go build ./每次重新运行某些项目会产生不同的结果?例如:$ cd go/src/github.com/google/cadvisor$ go build ./$ sh1sum cadvisorcdfc3c38898e2decd5df35b661737f7cc4f514ed  cadvisor$ go build ./$ sha1sum cadvisora94db96d684225e7a45cc68c5341fe6f57897c23  cadvisor完全隔离设置:$ go versiongo version go1.6.2 linux/amd64$ export GOPATH=$(mktemp -d)$ cd $GOPATH$ go get github.com/tools/godep$ go get github.com/google/cadvisorpackage 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 restoregodep: WARNING: Go version (go1.6) & $GO15VENDOREXPERIMENT= wants to enable the vendor experiment, but disabling because a Godep workspace (Godeps/_workspace) exists$ go build ./...
查看完整描述

2 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

这是因为您使用的是 CGO,Go 创建了一个用于编译 C 代码的 tmp 目录,并且该路径嵌入到二进制文件中。



查看完整回答
反对 回复 2022-01-10
?
冉冉说

TA贡献1877条经验 获得超1个赞

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,二进制文件将在 DWARF 部分中包含 $WORK 路径

当前问题:

1. cgo 构建中的 $WORK 路径泄漏。

2. -cover 和测试中的 $WORK 路径泄漏。


参考:https : //github.com/golang/go/issues/9206


3- 多次构建纯 Go 程序将生成相同的二进制文件。


我希望这有帮助。


查看完整回答
反对 回复 2022-01-10
  • 2 回答
  • 0 关注
  • 182 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信