首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从go二进制文件中的文本指令中删除文件路径

从go二进制文件中的文本指令中删除文件路径
EN

Stack Overflow用户
提问于 2017-07-24 11:25:06
回答 2查看 6.3K关注 0票数 19

我希望从我用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命令中示例程序集的某些部分:

代码语言:javascript
复制
$ 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,如果要将其推荐为解决方案,则不推荐会导致坏掉的可执行文件

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-25 11:50:09

使用-trimpath标志删除路径信息:

代码语言:javascript
复制
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将从精灵二进制文件中删除任何路径信息。

代码语言:javascript
复制
$ 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**:** 检查结果。

代码语言:javascript
复制
$ 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社区中仍然存在一些争议,尽管据说它已经被修复了。有人说,未知和不可预测的错误有时会发生。阅读这里这里以获取示例。

票数 12
EN

Stack Overflow用户

发布于 2019-05-01 20:12:19

trimpath是一种很好的方法,但也有类似go第24976期的问题。

看来,当传递多个-trimpath标志以进行工具编译时,最后一个将获胜。 实际上,据我所知,trimpath标志被定义为一个普通的字符串标志,而不是列表。

但是对于CL 173344,现在这个问题已经解决了(对于即将到来的Go 1.13)

cmd/内部/objabi:扩展-trimpath语法 这种CL会影响cmd/asmcmd/compile提供的低级别的cmd/compile标志。以前,该标志采用一个目录的名称,该目录将从结果对象文件中记录的路径中修剪。 这个CL 使标志接受一个以分号分隔的路径列表. 此外,每个路径现在都可以以一个可选的"=>replacement“结尾,指定要用什么替换领先路径前缀,而不仅仅是删除它。 后续CL将向cmd/go添加一种模式,该模式使用这个更丰富的-trimpath构建不包含任何本地路径名称的二进制文件。

我是CL 173345

cmd/go:添加-trimpath生成标志 "go build -trimpath“处理结果包和可执行文件中记录的文件路径,以避免记录任何本地目录的名称。 相反,文件似乎存储在名为"go/src/...“(用于标准库)的目录中,或者以文件出现在其中的模块或包命名。

这修复了第16860期,正如伊万·达尼鲁克所指出的,它可以生成位对位相同的二进制文件。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45279385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档