从go二进制文件

时间:2017-07-24 11:25:07

标签: go elf

我想从我使用/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 go命令的示例程序集的某些部分:

$ 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
.
.

请注意:如果您打算将其推荐为解决方案,则不建议stripcan lead to broken executables

2 个答案:

答案 0 :(得分:6)

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

$temp = [];

for ($data as $value){
   if($value['_id']['options'] == 'below-1'){
       $temp[] = $value;
    }
}

print_r($temp);

更多信息:

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 . . 工具在go社区仍然存在一些争议,尽管据说它已被修复。有人说有时会出现未知和不可预测的错误。请阅读herehere以获取示例。

答案 1 :(得分:0)

trimpath是一个很好的方法,但是遇到诸如go issue 24976

这样的问题
  

看来,当传递多个-trimpath标志以进行工具编译时,最后一个会获胜

     

的确;据我所知,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,正如Ivan Daniluk所指出的那样,它具有Go生成逐位相同二进制文件的能力。