出于好奇,我使用HEX编辑器打开了GO编译器生成的二进制文件,令我惊讶的是,我在二进制文件中找到了项目中使用的每个源代码的完整路径和文件名。
就像,很明显有类似 /home/myusername/myprojectname/source.go
的信息更让人惊讶的是,我发现诸如评论特定功能的工作原理
现在我知道了为什么用Golang编写并编译的“ Hello World”会生成3mb的二进制文件...
有人知道是否有办法从golang二进制文件中剥离这些东西吗?像是任何编译器标志吗?
答案 0 :(得分:4)
我发现诸如评论特定功能的工作原理
它们不是评论。它们是字符串文字,主要是错误消息。例如,
malloc.go: throw("persistentalloc: align is not a power of 2")
lfstack.go: print("runtime: lfstack.push invalid packing: node="
现在我知道为什么要用Golang编写并编译一个“ Hello World”了 生成一个3mb的二进制文件...
不,你没有。
Go: Frequently Asked Questions (FAQ)
Why is my trivial program such a large binary?
gc工具链中的链接器通过以下方式创建静态链接的二进制文件: 默认。因此,所有Go二进制文件都包含Go运行时以及 支持动态类型所需的运行时类型信息 检查,反射甚至是紧急时间堆栈跟踪。
一个简单的C“ hello,world”程序,使用以下程序静态编译和链接 Linux上的gcc约为750 kB,其中包括printf的实现。 使用fmt.Printf的等效Go程序的权重为 MB,但其中包含更强大的运行时支持和类型 和调试信息。
使用gc编译的Go程序可以与-ldflags = -w标志链接 禁用DWARF生成,从 二进制文件,但没有其他功能损失。这样可以减少 二进制大小。
用Golang编写并编译的“ Hello World”产生了3mb 二进制...
太夸张了;它是2.0MB。
$ go version
go version devel +c7026f9d14 Sat Feb 9 17:34:48 2019 +0000 linux/amd64
$ cat hello.go
package main
import "fmt"
func main() {
fmt.Println("Hello, 世界")
}
$ go build hello.go
$ ./hello
Hello, 世界
$ ls -s -h ./hello
2.0M ./hello
$