我想从我使用/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
.
.
请注意:如果您打算将其推荐为解决方案,则不建议strip
和can lead to broken executables。
答案 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社区仍然存在一些争议,尽管据说它已被修复。有人说有时会出现未知和不可预测的错误。请阅读here和here以获取示例。
答案 1 :(得分:0)
trimpath
是一个很好的方法,但是遇到诸如go issue 24976
看来,当传递多个
-trimpath
标志以进行工具编译时,最后一个会获胜的确;据我所知,
trimpath
标志被定义为普通字符串标志,而不是列表。
但是对于CL 173344,此问题现已修复(针对即将发布的Go 1.13)
cmd / internal / objabi:展开-trimpath语法
此CL影响提供的低级
-trimpath
标志 由cmd/asm
和cmd/compile
组成。以前,该标志采用的是要修剪的单个目录的名称 从结果对象文件中记录的路径中获取。
此CL 使标志采用分号分隔的路径列表。
此外,每个路径现在都可以以可选的“
=>replacement
”结尾 指定用什么替换前导路径前缀, 而不是仅仅丢弃它。后续CL将为使用此模式的模式添加到
cmd/go
更丰富的-trimpath
来构建不包含任何二进制文件的二进制文件 本地路径名。
这是CL 173345:
cmd/go
:添加-trimpath
构建标记“
go build -trimpath
”修剪结果包和可执行文件中记录的文件路径,以避免记录任何本地目录的名称。
而是,文件似乎存储在名为“go/src/...
”的目录中(对于标准库),或者以文件所在的模块或软件包的名称命名。
这修复了issue 16860,正如Ivan Daniluk所指出的那样,它具有Go生成逐位相同二进制文件的能力。