这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战
为什么我写的一个小程序实际二进制文件很大?
gc 工具链中的链接器(linker)默认会创建一个静态链接的二进制文件。 因此, Go 二进制文件中其实包含了很多东西: Go runtime运行时,以及支持动态类型检查、反射、甚至panic时堆栈跟踪所需的运行时类型信息。
如果在 Linux 上使用 gcc 静态编译 C语言程序打印“hello, world”,这个程序大约 是750 kB,其中包括 printf 的实现。 而使用 fmt.Printf 写的的等效 Go 程序,会大几百万个字节,但是,却包括了更强大的运行时支持内容和调试信息。
你可以在使用 gc 编译的 Go 程序上加上参数 -ldflags=-w 标志,来禁用 DWARF 生成,这样会从二进制文件中删除调试信息,但不会丢失其他功能。 这可以大大减少二进制文件大小。
为什么我的病毒扫描软件认为我的 Go 编译的二进制文件被感染了?
这是一种很常见的情况,尤其是在 Windows 机器上,并且几乎总是误报。 商业病毒扫描程序经常会被 Go 二进制文件的结构所迷惑,因为Go的二进制文件并不像其他语言编译的文件一样那样经常看到。
如果您刚刚安装了 Go 发行版并且系统报告它已被感染,那肯定是一个错误。 如果要真正彻底的确认,您可以通过将下载的内容与下载页面上的内容进行验证。
在任何情况下,如果您认为报告有误,请向您的病毒扫描程序供应商报告错误。 这样也许能让病毒扫描程序学习理解 Go 程序。