UPX 压缩 go build 可执行文件


Go 是静态编译语言,go build正常编译时会将依赖以及调试信息等都打包进去,不需要运行环境支持,但是这样一来,可执行文件体积就比较大,怎么解决呢,通过查询资料,有两种方法可以进一步减小可执行文件的体积。

设置编译参数

go build 命令提供有可选编译参数,其中 -ldflags 选项将 go tool link 的参数传递给 go build,其中有下面两个参数,可以减少编译后的体积

$ go tool link --help
usage: link [options] main.o
  ...
  -s    disable symbol table      # 去掉符号表信息
  -w    disable DWARF generation  # 去掉 DWARF 调试信息,不能进行 gdb 调试 
  ...

实际测试下:

# 不添加编译参数
$ go build
# 查看大小
$ ll sql2md
-rwxrwxr-x 1 mazhuang mazhuang 9.8M Sep  2 15:00 sql2md

# 添加编译参数 -w
$ go build -ldflags="-w"
$ ll sql2md             
-rwxrwxr-x 1 mazhuang mazhuang 8.1M Sep  2 15:08 sql2md

# 添加编译参数 -s
$ go build -ldflags="-s"
$ ll sql2md
-rwxrwxr-x 1 mazhuang mazhuang 7.3M Sep  2 15:08 sql2md

# 添加编译参数 -w -s
$ go build -ldflags="-w -s" 
$ ll sql2md
-rwxrwxr-x 1 mazhuang mazhuang 7.3M Sep  2 15:02 sql2md

可以看到体积有了缩减,但是并不是很明显,其中 -s-w -s 选项编译后的体积的是一样的,且体积最小

使用 UPX 压缩

UPX(The Ultimate Packer for eXecutables) 是开源的可执行文件压缩软件,UPX 通常会将程序和 DLL 的文件大小减少约 50%-70%,从而 减少磁盘空间、网络加载时间、下载时间和其他分销和存储成本。

UPX 压缩的程序和库是完全独立的并完全像以前一样运行,大多数情况下没有运行时或内存损失支持的格式。

安装

# For CentOS/Fedora/RHEL
$ sudo yum install upx
# For Ubuntu
$ sudo apt install upx

压缩测试

不使用编译参数,编译后压缩

$ go build && upx sql2md 
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2017
UPX 3.94        Markus Oberhumer, Laszlo Molnar & John Reiser   May 12th 2017

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
  10190160 -$   5405412   53.05%   linux/amd64   sql2md                        

Packed 1 file.

$ ll sql2md
-rwxrwxr-x 1 mazhuang mazhuang 5.2M Sep  2 17:08 sql2md

重新编译携带编译参数

$ go build -ldflags="-s" && upx sql2md
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2017
UPX 3.94        Markus Oberhumer, Laszlo Molnar & John Reiser   May 12th 2017

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
   7620264 ->   2833612   37.19%   linux/amd64   sql2md                        

Packed 1 file.

$ ll sql2md
-rwxrwxr-x 1 mazhuang mazhuang 2.8M Sep  2 17:19 sql2md

带参数编译后再压缩,体积从 9.8 缩小到 2.8, 减少了约 71.4%,有了很明显的改善


文章作者: MaZhuang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 MaZhuang !
  目录