linux下編譯upx 3.93


昨天,UPX發布了3.93版本。
UPX(the Ultimate Packer for eXecutables)是一個非常全面的可執行文件壓縮軟件,支持dos/exe、dos/com、dos/sys、djgpp2/coff、 watcom/le、win32/pe、rtm32/pe、tmt/adam、atari/tos、linux/i386等幾乎所有平台上的可執行文件, 具有極佳的壓縮比,還可以對未壓縮的文件和壓縮完后進行比較。

1、准備源碼包

直接去github下載zip包或者直接克隆一下。

git clone https://github.com/upx/upx.git
cd upx
rmdir lzma-sdk
git clone https://github.com/upx/upx-lzma-sdk.git lzma-sdk

lzma庫無需編譯。

然后去下載UCL庫。
UCL是完全使用ANSI C編寫的NRV(Not Really Vanished)算法的一個開源實現。 具體的介紹請查閱http://www.oberhumer.com/opensource/ucl/

wget http://www.oberhumer.com/opensource/ucl/download/ucl-1.03.tar.gz

國外的網站下載比較慢,可以直接點擊此處下載我已經下好的。

2、編譯

UCL編譯

先生成Makefile文件

tar -xzvf ucl-1.03.tar.gz
cd ucl-1.03
./configure --prefix=/home/o/ucl CC=clang

注意上面,指定了C編譯器為clang。這里是因為gcc的一個bug,導致 ACC一致性測試失敗 ,所以使用clang。
gcc出現的錯誤情況在這里FTBFS with GCC 6: compiler failed the ACC conformance test有詳細描述。

編譯UPX

使用下面命令編譯upx

make all UPX_UCLDIR=/home/o/upx/ucl/ucl-1.03 UPX_LZMADIR=./src/lzma-sdk

注意,這里的UPX_UCLDIR變量的值必須是絕對路徑。
編譯出的結果是upx.out程序,在src目錄下。

3、使用測試

先查看一下編譯出upx.out的文件大小

> ls -l upx.out
-rwxr-xr-x 1 o users 2006544 2月   8 16:08 upx.out

然后用其對自身進行壓縮一下

cp upx.out upx.out2

> ./upx.out upx.out2 
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2017
UPX git-fdce70  Markus Oberhumer, Laszlo Molnar & John Reiser   Jan 29th 2017

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
   2006544 ->    479576   23.90%   linux/amd64   upx.out2                      

Packed 1 file.

WARNING: this is an unstable beta version - use for testing only! Really.

> ls -lh upx.out2
-rwxr-xr-x 1 o users 469K 2月   8 16:09 upx.out2

可以看到,壓縮的效果還是很明顯的。

為了對比,下面使用strip刪除多余信息,並使用gzexe壓縮(先還原upx.out2,通過命令./upx.out -d upx.out2

> strip upx.out2 

> ll upx.out2
-rwxr-xr-x 1 o users 1.7M 2月   8 16:13 upx.out2

> gzexe upx.out2
upx.out2:	 72.7%

> ll upx.out2   
-rwxr-xr-x 1 o users 455K 2月   8 16:14 upx.out2

UPX相對gzexe不一定有壓縮上的優勢,但是其具有跨平台的優勢。且UPX壓縮之后的程序依然是一個ELF文件,但gzexe壓縮之后的程序是一個posix shell腳本(后部分是壓縮后的程序二進制文件)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM