我希望从我用go build创建的可执行文件中删除所有路径信息(如/Users/myuser/dev/go/src/fooapi/spikes/mongoapi.go )。
我正在像这样编译代码:
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,如果要将其推荐为解决方案,则不推荐会导致坏掉的可执行文件。
发布于 2017-07-25 11:50:09
使用-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将从精灵二进制文件中删除任何路径信息。
$ 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 ./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社区中仍然存在一些争议,尽管据说它已经被修复了。有人说,未知和不可预测的错误有时会发生。阅读这里和这里以获取示例。
发布于 2019-05-01 20:12:19
trimpath是一种很好的方法,但也有类似go第24976期的问题。
看来,当传递多个
-trimpath标志以进行工具编译时,最后一个将获胜。 实际上,据我所知,trimpath标志被定义为一个普通的字符串标志,而不是列表。
但是对于CL 173344,现在这个问题已经解决了(对于即将到来的Go 1.13)
cmd/内部/objabi:扩展-trimpath语法 这种CL会影响
cmd/asm和cmd/compile提供的低级别的cmd/compile标志。以前,该标志采用一个目录的名称,该目录将从结果对象文件中记录的路径中修剪。 这个CL 使标志接受一个以分号分隔的路径列表. 此外,每个路径现在都可以以一个可选的"=>replacement“结尾,指定要用什么替换领先路径前缀,而不仅仅是删除它。 后续CL将向cmd/go添加一种模式,该模式使用这个更丰富的-trimpath构建不包含任何本地路径名称的二进制文件。
cmd/go:添加-trimpath生成标志 "go build -trimpath“处理结果包和可执行文件中记录的文件路径,以避免记录任何本地目录的名称。 相反,文件似乎存储在名为"go/src/...“(用于标准库)的目录中,或者以文件出现在其中的模块或包命名。
https://stackoverflow.com/questions/45279385
复制相似问题