0%

Go 编译时去除 bin 文件中的编译路径 GOPATH 信息

问题原因

golang 程序 panic,或者通过 runtime.Caller(0) 获取当前出错的文件位置作为日志记录时,会暴露程序编译机器上的项目路径、以及账户,不如下面这些信息, 这些信息我们并不想让对方看到。

1
2
3
4
panic: oh! no!
goroutine 1 [running]:
main.main()
/Users/jerry/go/src/demo/panic_demo/main.go:10 +0x64

问题现象

当我们通过 strings panic_demo | grep /Users 静态分析golang 编译后的二进制就可以得到完整的源码路径信息:

1
2
3
/Users/jerry/go/src/demo/panic_demo/main.go
/Users/jerry/go/src/demo/panic_demo/main.go
/Users/jerry/go/src/demo/panic_demo

这些信息我们可能并不想让对方知道, 所以我们需要对这些信息进行处理, 剔除这些信息。

解决方式

在编译是通过传入以下参数来剔除:

1
go build -gcflags=-trimpath=${GOPATH}-asmflags=-trimpath=${GOPATH}

更彻底的方式:

1
go build -gcflags=-trimpath=$GOPATH -asmflags=-trimpath=$GOPATH -ldflags "-w -s"

处理完后显示是这个样子,不带 ${GOPATH}信息也不影响正常的堆栈信息。

1
2
3
4
panic: oh! no!
goroutine 1 [running]:
main.main()
src/demo/myssl_demo/getcert_demo.go:10 +0x64