GoLang可执行程序文件瘦身方法

GoLang可执行程序文件瘦身方法

GoLang可执行程序文件瘦身方法

Go 是为编写服务器而设计的。这就是它今天最广泛使用的方式,因此运行时和编译器上的大量工作都集中在对服务器很重要的问题上:延迟、易于部署、精确的垃圾收集、快速启动时间、性能。

随着 Go 被用于更广泛的程序,必须考虑新的问题。其中之一是二进制大小。它已经被关注了很长时间(问题#6853是两年多前提交的),但是人们对使用 Go 在较小设备(例如 Raspberry Pi 或移动设备)上部署二进制文件的兴趣越来越大,为了节省存储空间,我们就需要各种方法缩减可执行文件的大小。

下面我们来看下我总结的缩减文件大小的方法吧。

保守的瘦身方法

GoLang使用静态库编译链接,因此不依赖动态库,不会因为目标系统的动态库版本问题而无法运行。

strip

  • 通过命令: strip <bin_file>
  • 通过编译选项: go build -ldflags="-w -s"

禁用函数内联

添加-gcflags=all=-l编译选项,对于大项目时更适合,可以缩减文件大小约10%

go build -ldflags="-w -s" -gcflags=all=-l

禁用边界检查

添加标志-gcflags=all=-B

go build -a -gcflags=all="-l -B" -ldflags="-w -s" 

激进的瘦身方法

  • upx工具: 压缩可执行文件,将二进制文件再缩小 50% 以上,代价是增加启动时间可能增加内存使用

UPX是一个免费的、可移植的、可扩展的、高性能的 可执行打包程序,适用于多种可执行格式。UPX 实现了 出色的压缩比并提供了 非常快速的解压缩upx命令源码下载地址

下面是upx命令的使用帮助信息:

$ upx
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2020
UPX 3.96        Markus Oberhumer, Laszlo Molnar & John Reiser   Jan 23rd 2020

Usage: upx [-123456789dlthVL] [-qvfk] [-o file] file..

Commands:
  -1     compress faster                   -9    compress better
  -d     decompress                        -l    list compressed file
  -t     test compressed file              -V    display version number
  -h     give more help                    -L    display software license
Options:
  -q     be quiet                          -v    be verbose
  -oFILE write output to 'FILE'
  -f     force compression of suspicious files
  -k     keep backup files
file..   executables to (de)compress

Type 'upx --help' for more detailed help.

UPX comes with ABSOLUTELY NO WARRANTY; for details visit https://upx.github.io

来看下简单示例:

下面是对yq命令的瘦身处理过程:

$ ls -lh ./yq
-rwxr-xr-x 1 testuser users 7388374  9月 22 12:06 ./yq
$ file yq
yq: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, not stripped

$ cp yq yq.upx
$ upx -5 ./yq.upx
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2020
UPX 3.96        Markus Oberhumer, Laszlo Molnar & John Reiser   Jan 23rd 2020

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
   7388374 ->   4090160   55.36%    linux/arm    yq.upx                        

Packed 1 file.

$ ls -l ./yq*
-rwxr-xr-x 1 testuser users 7388374  9月 22 12:06 ./yq
-rwxr-xr-x 1 testuser users 5187420  9月 22 12:07 ./yq.striped
-rwxr-xr-x 1 testuser users 4090160  9月 22 14:14 ./yq.upx

瘦身效果还可以吧。记得进行瘦身处理后的可执行程序最好放到目标主机上进行验证一下,保证可以正确运行,避免出现段错误(Segmentation Fault)无法运行问题。不正确的瘦身处理会导致可执行程序不可运行的。

转载本文时请注明出处及本文链接地址GoLang可执行程序文件瘦身方法

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注