前言

在软件开发和分发过程中,文件大小一直是一个需要关注的重要因素。特别是在嵌入式系统、旧硬件或网络传输速度较慢的环境中,优化可执行文件的大小变得尤为重要。在这方面,UPX (Ultimate Packer for eXecutables) 是一个强大且高效的工具,能够显著减小可执行文件的体积。

什么是 UPX?

UPX 是一个免费的、跨平台的可执行文件压缩工具。它能够压缩多种操作系统下的可执行文件,包括 Windows、Linux、MacOS 以及其他一些操作系统。UPX 的主要优点在于,它不仅可以大幅度减少文件体积,还能保持可执行文件的运行速度,几乎不影响程序的启动时间。

为什么选择 UPX?

  1. 高压缩率:UPX 能够将可执行文件压缩到原始大小的 30%-50% 之间,有时甚至更小。
  2. 快速解压:被压缩的文件在加载时会自动解压,这个过程非常快速,几乎不会影响程序的启动速度。 支持多种文件格式:UPX
  3. 支持多种文件格式:包括但不限于 PE (Windows)、ELF (Linux)、Mach-O (MacOS)、COFF 等。
  4. 开源与免费:UPX 是一个开源项目,免费提供使用,并且拥有活跃的社区和丰富的文档支持。

如何使用 UPX?

使用 UPX 非常简单。假设你已经下载并解压了 UPX,你可以通过命令行来压缩可执行文件。以下是一些基本的使用方法:

1. 压缩文件:

upx yourfile.exe

2. 查看压缩信息:

upx -l yourfile.exe

3. 解压文件:

upx -d yourfile.exe

UPX 提供了多种压缩选项,用户可以根据需要进行调整。例如,可以使用 --best 选项来启用最好的压缩率,或使用 --ultra-brute 来尝试所有可能的压缩方式以达到最小的文件大小。

UPX 的工作原理

UPX 的工作原理类似于普通的文件压缩工具,比如 ZIP 或 RAR,但它专注于可执行文件。UPX 会对可执行文件中的代码和数据段进行压缩,同时在文件头部添加一个小型解压程序。当你运行被压缩的可执行文件时,这个解压程序会首先运行,负责将压缩的数据段恢复到内存中,然后继续执行原始程序的代码。

这种方法的优势在于,解压过程是瞬时的,并且只在文件首次加载时进行,因此对运行时性能影响极小。

实际应用案例

UPX 在多种场景下都有广泛应用,以下是一些实际案例:

  1. 嵌入式系统:在资源有限的嵌入式系统中,UPX 可以显著减少可执行文件的体积,从而节省存储空间和带宽。
  2. 老旧硬件:在老旧硬件上,存储空间可能非常有限,通过 UPX 压缩可以使更多的程序得以运行。
  3. 移动应用:在移动应用开发中,较小的可执行文件可以减少安装包的大小,提高用户下载和安装的速度。
  4. 软件分发:在网络分发软件时,使用 UPX压缩可以显著减少传输时间和流量费用。

实例

原始文件内容

$ ls sotruss -lh
-rwxr-xr-x 1 liyongjun liyongjun 4.3K 627 23:46 sotruss
$ head sotruss -n 20
#! /bin/bash
# Copyright (C) 2011-2020 Free Software Foundation, Inc.
# This file is part of the GNU C Library.

# The GNU C Library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.

# The GNU C Library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.

# You should have received a copy of the GNU Lesser General Public
# License along with the GNU C Library; if not, see
# <https://www.gnu.org/licenses/>.

# We should be able to find the translation right at the beginning.
TEXTDOMAIN=libc

压缩

$ upx sotruss
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2018
UPX 3.95        Markus Oberhumer, Laszlo Molnar & John Reiser   Aug 26th 2018

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
      4310 ->      3782   87.75%  linux.sh/i386  sotruss                       

Packed 1 file.
$ ls sotruss -lh
-rwxr-xr-x 1 liyongjun liyongjun 3.7K 627 23:46 sotruss
$ 
$ head sotruss -n 20                                                                                                                                                             EԐԐԐÿÿ࠾#! /binashUPXe 
oundation, Inc.8This fi½µֵlp$@, th¬m¿½GNUU Libry)* 
                                                 2f`smھ{; ya can 
                                                                  dtڽk�tYTd/orDmoݢ»wfyerj"rms¿޽󿿷Lessenal PuµԶ򡫩c<wcM{kϪ🡹7ꬳ·ei{v`n¸s.1mQ½Vh9/¿ws_K8)´Zla²09�ڐZhFڶ­йhT붡Ƣu𞪦ul,F+ WITHOUT ANYºͽ½
                                                                                                                                                                                            ARRTY;+5oes®}յIimpꙙo{󜺮ty¼@MERCH1ABILG´˷oYNESSORSÿվ+6QTICUL 
URPOSE. !eef
#hڤ,ffR¯0¶]0M¨ta󿿳þY՚ءslۡ珞第iva򯺆±lRg�¾QX& notoÿF·(e3<ٴps://w.gn;󚚵.g/lHs/>We®5
e;slm=i *at,g#޾߶ngDTEXTDOMAIN=[bcϮ󈐽/½r/ank̟yo䞴u~󁮅SOTRUw_FR+YSTTOڂVٷNAUoI(a  ial谛 
                                                                          ۣNO}E
쿡WHԈ=$$
¢='$¶ζ¾`B/aut3rߞ¶�.
                   '¢do_㫰(/ 
7λ
ÿ­! $"½򂽕sage: , [OP*ON.hl�
                          --E9-»¬왌E
owA馐l}Ep=Ϙcc/op펨g                 -&쬖׊-F+om 񃟻 Th¦�objvt૸_²n(>T¡TO󈐺>to<ֿ_G;eexit ٻ±MA3ow ␡ⳮc򠷱/Af¼o
                   ¼/ځ\WJ󿖴o}(or
                                .$PID}½¯֮M
.ea¯쵫vd)sHadVj
  6ߘr�ǯ@ʹ҇yމّt
-uૻ3p¸a䝭݂",<ڮP󿭴
gm"8
(>y0Mµ"´v3»guYYn㓰re񶾫ح,eic˶m·sp%d\n¥6쁷.\n"qrF¹­p;H^8p-¡󿿷Fӫs󎱷eqB:\Yc;·B%GH \졒ґj.A"h­-µ.d.­Eua׍쳯+©/g
}]musz_𤶹
          >&2£u:Ē»
                  ¦qui季!½mCt '#'چ#𢯢FT*\`v`0'ﺶFȧ®5
m
 6°±策¿-
¦ok®w4͍°m7#g!&Æ,dolS"
b­ᚧ顅¼=´(ne
\ni º±N.O! |;l°H'r°ɦi	o
a#kP` ᧕h¶h򳵰{ ޢ9¤5)"A脐a褳"4J䡩,®᝞ND6¿Cc´F&wheL?q 
noY¼`7풂
P"¡ڸrNtVԭt¡m`¶ªl3 D/H³ףp/

解压

$ upx -d sotruss
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2018
UPX 3.95        Markus Oberhumer, Laszlo Molnar & John Reiser   Aug 26th 2018

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
      4310 <-      3782   87.75%  linux.sh/i386  sotruss

Unpacked 1 file.
$ ls sotruss -lh
-rwxr-xr-x 1 liyongjun liyongjun 4.3K 627 23:46 sotruss
$ head sotruss -n 20
#! /bin/bash
# Copyright (C) 2011-2020 Free Software Foundation, Inc.
# This file is part of the GNU C Library.

# The GNU C Library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.

# The GNU C Library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.

# You should have received a copy of the GNU Lesser General Public
# License along with the GNU C Library; if not, see
# <https://www.gnu.org/licenses/>.

# We should be able to find the translation right at the beginning.
TEXTDOMAIN=libc

总结

UPX 是一个功能强大、易于使用且高效的可执行文件压缩工具。无论是在节省存储空间、减少网络传输时间还是优化资源利用方面,UPX 都表现出色。如果你正在寻找一种方法来减小可执行文件的体积,UPX 无疑是一个值得尝试的选择。

通过合理使用 UPX,你可以在不牺牲性能的前提下,显著优化你的软件发布和运行环境。这正是 UPX 的魅力所在:简单、高效、实用。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐