Published on

Go 语言编译二进制包体积优化

在使用 Go 语言开发命令行工具或服务时,默认编译生成的二进制文件体积往往较大。本文记录几种常见的优化手段,帮助减小二进制包的体积。

一、默认编译

首先看下默认编译的大小。假设我们有一个简单的 main.go

go build -o app main.go

查看大小(示例):

ls -lh app
# -rwxr-xr-x  1 user  staff   10M  Nov 29 10:00 app

二、去除调试信息和符号表

Go 编译器默认会将调试信息和符号表包含在二进制文件中。我们可以通过 -ldflags 参数来去除它们。

  • -s: 忽略符号表和调试信息。
  • -w: 忽略 DWARFv3 调试信息,使程序无法使用 gdb 调试。
go build -ldflags="-s -w" -o app-optimized main.go

通常这一步能减少约 20% - 30% 的体积。

三、移除文件路径信息

默认情况下,panic 堆栈信息中会包含文件的绝对路径。使用 -trimpath 可以移除这些路径信息,不仅能减小体积,还能提高安全性。

go build -trimpath -ldflags="-s -w" -o app-optimized main.go

四、使用 UPX 压缩

如果对体积有极致要求,可以使用 UPX 工具对二进制文件进行加壳压缩。

  1. 安装 UPX (以 Windows 为例,或者 Linux apt install upx)
  2. 执行压缩:
upx --best app-optimized

压缩后体积通常能减少 50% - 70%,但启动时会有微小的解压开销。

总结

一般情况下,推荐使用 -trimpath 配合 -ldflags="-s -w" 进行编译,既能有效减小体积,又不影响运行时性能。

go build -trimpath -ldflags="-s -w" -o app main.go