隐藏Go语言可执行程序中的源码路径

Go 语言编译后的可执行程序中,一般包含源码的一些信息,当panic的时候,会暴露出编译时的源码路径,做为一个强迫症晚期患者,这是不可容忍的。Go语言编译器提供了选项 -trimpath 用于解决这个问题。

示例代码

package main

import (
	"github.com/nectarian/log"
)

func main() {
	log.Info("go")

	log.Panic("== WARNING ==")
}

运行

$ go build -o testing
$ ./testing
2021-06-25T10:21:40+08:00	info	testing/main.go:8	go
2021-06-25T10:21:40+08:00	panic	testing/main.go:10	== WARNING ==
panic: == WARNING ==

goroutine 1 [running]:
go.uber.org/zap/zapcore.(*CheckedEntry).Write(0xc00015e0c0, 0x0, 0x0, 0x0)
	/path/to/go_path/pkg/mod/go.uber.org/zap@v1.17.0/zapcore/entry.go:234 +0x58d
go.uber.org/zap.(*Logger).Panic(0xc0000744b0, 0x601fd1, 0xd, 0x0, 0x0, 0x0)
	/path/to/go_path/pkg/mod/go.uber.org/zap@v1.17.0/logger.go:227 +0x85
github.com/nectarian/log.Panic(...)
	/path/to/go_path/pkg/mod/github.com/nectarian/log@v0.0.0-20210621105621-28566f320581/log.go:135
main.main()
	/path/to/source/main.go:10 +0x8d

上面的 panic 信息中包含了源代码路径和 GOPATH 环境变量的路径。

使用trimpath

$ go build -o testing -trimpath
$ ./dist/testing/testing 
Version
--------------------------------------------------------------
Version:        v0.0.1
Commit Hash:    
Build Time:     2021-06-24 17:27:07
--------------------------------------------------------------
2021-06-25T10:24:06+08:00	info	testing/main.go:12	go
2021-06-25T10:24:06+08:00	panic	testing/main.go:14	== WARNING ==
panic: == WARNING ==

goroutine 1 [running]:
go.uber.org/zap/zapcore.(*CheckedEntry).Write(0xc00015e0c0, 0x0, 0x0, 0x0)
	go.uber.org/zap@v1.17.0/zapcore/entry.go:234 +0x76d
go.uber.org/zap.(*Logger).Panic(0xc00011a460, 0x6f35bb, 0xd, 0x0, 0x0, 0x0)
	go.uber.org/zap@v1.17.0/logger.go:227 +0x9b
github.com/nectarian/log.Panic(...)
	github.com/nectarian/log@v0.0.0-20210621105621-28566f320581/log.go:135
main.main()
	app/testing/main.go:14 +0xc5

此时 panic 信息中的源码路径已经是相对路径了