【问题标题】:Remove file paths from TEXT directives in go binaries从 go 二进制文件中的 TEXT 指令中删除文件路径
【发布时间】:2017-12-29 23:14:31
【问题描述】:

我想从我用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 不推荐,can lead to broken executables 如果您要推荐它作为解决方案。

【问题讨论】:

  • 顺便说一句,关于 strip 的问题已经很老了,不再相关。 any 工具链普遍接受的解决方案是在临时或通用构建路径中构建可执行文件。

标签: go elf


【解决方案1】:

使用 -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 二进制文件中删除所有路径信息。

$ 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 社区中仍然存在一些争议,尽管据说已经修复。有人说有时会发生未知和不可预测的错误。阅读herehere 了解示例。

【讨论】:

    【解决方案2】:

    trimpath 是一个不错的方法,但遇到了go issue 24976 之类的问题

    看来,当传递多个 -trimpath 标志以进行 go tool compile 时,最后一个获胜

    确实;据我所知,trimpath 标志被定义为普通字符串标志,而不是列表。

    但是有了CL 173344,这个问题现在已经修复(针对即将到来的 Go 1.13)

    cmd/internal/objabi: 展开 -trimpath 语法

    此 CL 影响提供的低级 -trimpath 标志 通过cmd/asmcmd/compile

    以前,该标志采用将被修剪的单个目录的名称 来自生成的目标文件中记录的路径。

    此 CL 使标志采用分号分隔的路径列表

    此外,每条路径现在都可以以可选的“=>replacement”结尾 指定用什么替换该前导路径前缀, 而不是仅仅丢弃它。

    后续 CL 将向 cmd/go 添加一个使用此模式的模式 更丰富的-trimpath 构建不包含任何 本地路径名。

    这是CL 173345

    cmd/go:添加-trimpath构建标志

    "go build -trimpath" 修剪生成的包和可执行文件中记录的文件路径,以避免记录任何本地目录的名称。
    相反,这些文件似乎存储在名为“go/src/...”(用于标准库)或以文件所在的模块或包命名的目录中。

    这修复了issue 16860,这是关于 Go 生成逐位相同二进制文件的能力,如 Ivan Daniluk 所述。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-22
      • 1970-01-01
      • 2012-10-13
      • 2012-06-11
      • 2012-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多