我想从创建的可执行文件中 删除 所有路径信息。/Users/myuser/dev/go/src/fooapi/spikes/mongoapi.go``go build
/Users/myuser/dev/go/src/fooapi/spikes/mongoapi.go``go build
我正在编译这样的代码:
CGO_ENABLED=0 go build -v -a -ldflags="-w -s" -o ./fooapi spikes/mongoapi.go
上面的go build命令中的示例程序集的一部分:
$ go tool objdump ./fooapi . . TEXT main.init(SB) /Users/myuser/dev/go/src/api/spikes/mongoapi.go mongoapi.go:60 0x12768c0 65488b0c25a0080000 GS MOVQ GS:0x8a0, CX mongoapi.go:60 0x12768c9 483b6110 CMPQ 0x10(CX), SP mongoapi.go:60 0x12768cd 7663 JBE 0x1276932 . .
注意:strip不建议使用:,如果您将其推荐为解决方案,则可能导致可执行文件损坏。
strip
使用-trimpath标志删除路径信息:
CGO_ENABLED=0 go build -v -a -ldflags="-w -s" \ -gcflags=-trimpath=/Users/myuser/dev/go/src \ -asmflags=-trimpath=/Users/myuser/dev/go/src \ -o ./fooapi spikes/mongoapi.go
更多信息:
传递-trimpath给-gcflags并将-asmflags从elf二进制文件中删除所有路径信息。
-trimpath
-gcflags
-asmflags
$ go tool asm -help 2>&1 | grep -A1 trimpath -trimpath string remove prefix from recorded source file paths $ go tool compile -help|grep -A1 trimpath -trimpath string remove prefix from recorded source file paths
您可以使用以下方法检查结果go tool objdump:
go tool objdump
$ go tool objdump ./fooapi . . TEXT main.init(SB) api/spikes/mongoapi.go mongoapi.go:60 0x12768c0 65488b0c25a0080000 GS MOVQ GS:0x8a0, CX mongoapi.go:60 0x12768c9 483b6110 CMPQ 0x10(CX), SP mongoapi.go:60 0x12768cd 7663 JBE 0x1276932 . .
strip尽管有人说它已经修复,但在go社区中使用工具仍存在一些争议。有人说,有时会发生未知且无法预测的错误。在此处和此处阅读示例。