【问题标题】:Why does Go produce big binary files for small programs?为什么 Go 会为小程序生成大的二进制文件?
【发布时间】:2014-06-11 21:09:38
【问题描述】:

为什么 Go 编译器会生成大的二进制文件?

例如在编译以下代码后,我得到一个 1.8 MB 的 exec 文件

package main
import "fmt"
func main(){
   fmt.Println("Hello World")
}

我在 UbuntuWin7 上测试了上面的代码,结果是一样的!

我还用 +70 行代码编写了一个更大的程序,生成的二进制文件再次惊人地 1.8 MB(实际上有几个字节的差异)。我想知道 Go 编译器将什么转储到二进制文件中。

【问题讨论】:

标签: binary go size


【解决方案1】:

Why is my trivial program such a large binary?(来自 Go 编程语言常见问题解答):

gc 工具链中的链接器(5l、6l 和 8l)执行静态链接。 因此,所有 Go 二进制文件都包含 Go 运行时,以及支持动态类型检查、反射甚至恐慌时堆栈跟踪所需的运行时类型信息。

在 Linux 上使用 gcc 静态编译和链接的简单 C“hello, world”程序大约 750 kB,包括 printf 的实现。使用 fmt.Printf 的等效 Go 程序大约为 1.2 MB,但其中包含更强大的运行时支持。

【讨论】:

  • 暗示:由于 2MB 来自于一大块运行时/标准库的链接,因此二进制大小与您编写的代码量不成比例——如果您编写 10 倍或 100 倍的 Hello World,您通常不会得到 18MB 或 180MB 的二进制文件。
  • @twotwotwo,那么有没有针对嵌入式系统优化的 go 版本?
  • 如果您的目标设备无法获取 2MB 的二进制文件,您可能无法使用 Go。如果您使用 -compiler gccgo 构建,它会将一些标准库推送到设备上所有 Go 二进制文件共享的 libgo 中,但无论如何,您的程序需要该代码并且它会占用某个地方的空间(只是例如,Java 和 C# 需要在目标机器上安装它们的运行时)。
  • 另外请注意,在 Go 1.3 中它变得更好了。
  • 即使使用 Go 1.7,“Hello World”仍然不是一个兆……
猜你喜欢
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多