出于好奇,我使用十六进制编辑器打开了 GO 编译器生成的二进制文件,令我惊讶的是,我在二进制文件中发现了项目中使用的每个源代码的完整路径和文件名。
就像,很明显有像/home/myusername/myprojectname/source.go这样的信息
更惊讶的是,我发现了诸如特定功能如何工作的注释之类的东西
现在我知道为什么用 Golang 编写并编译的“Hello World”会生成 3mb 的二进制文件......
有谁知道是否有办法从 golang 二进制文件中删除这些东西?比如,有编译器标志吗?
\n\n\n我发现了诸如特定功能如何工作的评论之类的东西
\n
它们不是评论。它们是字符串文字,主要是错误消息。例如,
\n\nmalloc.go: throw("persistentalloc: align is not a power of 2")\n\nlfstack.go: print("runtime: lfstack.push invalid packing: node="\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n现在我知道为什么用 Golang 编写并编译的“Hello World”会生成 3mb 的二进制文件......
\n
不,你不知道。
\n\n\n \n\n \n\n\n\ngc 工具链中的链接器默认创建静态链接的二进制文件。因此,所有 Go 二进制文件都包含 Go 运行时,以及支持动态类型检查、反射甚至恐慌时堆栈跟踪所需的运行时类型信息。
\n\n在 Linux 上使用 gcc 静态编译和链接的简单 C“hello, world”程序约为 750 kB,其中包括 printf 的实现。使用 fmt.Printf 的等效 Go 程序重达几兆字节,但是包括更强大的运行时支持以及类型和调试信息。
\n\n使用 gc 编译的 Go 程序可以与 -ldflags=-w 标志链接以禁用 DWARF 生成,从二进制文件中删除调试信息,但不会丢失其他功能。这可以大大减少二进制文件的大小。
\n
\n\n\n用 Golang 编写并编译的“Hello World”会生成一个 3mb\n 的二进制文件...
\n
这是夸张的说法;是 2.0MB。
\n\n$ go version\ngo version devel +c7026f9d14 Sat Feb 9 17:34:48 2019 +0000 linux/amd64\n$ cat hello.go\npackage main\n\nimport "fmt"\n\nfunc main() {\n fmt.Println("Hello, \xe4\xb8\x96\xe7\x95\x8c")\n}\n$ go build hello.go\n$ ./hello\nHello, \xe4\xb8\x96\xe7\x95\x8c\n$ ls -s -h ./hello\n2.0M ./hello\n$ \nRun Code Online (Sandbox Code Playgroud)\n