准备资源:将下载库置于同一文件中
1、下载uclzlib库及编译
wget http://www.oberhumer.com/opensource/ucl/download/ucl-1.03.tar.gz
tar xvf ucl-1.03.tar.gz
cd ucl-1.03
./configure --prefix=$PWD/../test CXX=arm-hisiv600-linux-g++ AR=arm-hisiv600-linux-ar --host=arm-hisiv600-linux
make
make install
清理:
make clean
2、下载zlib库及编译
wget http://pkgs.fedoraproject.org/repo/pkgs/zlib/zlib-1.2.3.tar.gz/debc62758716a169df9f62e6ab2bc634/zlib-1.2.3.tar.gz
export CXX=arm-hisiv600-linux-g++
export CC=arm-hisiv600-linux-gcc
export AR=arm-hisiv600-linux-ar
export RANLIB=arm-hisiv600-linux--ranlib
./configure --prefix=$PWD/../test
make
make install
因为以上库输出目录均为:$PWD/../test目录,故在编译upx需抛出此路径;
注意在zlib编译时同时生成.a与.so,在编译upx时,如果需要使用静态库,则删掉动态库,不做处理默认链接动态库.so,在程序运行时也需要拷贝此动态库到arm板子上。
3、下载upx库及编译
wget http://upx.sourceforge.net/download/upx-3.91-src.tar.bz2
UPX_UCLDIR=$PWD/../test CXX=arm-hisiv600-linux-g++ make all
编译成功后可在upx-3.91-src/src下查看到可执行文件upx.out!!!
遇到问题:链接-lucl -lz找不到路径
链接报错:
#-lucl -lz
/opt/hisi-linux/x86-arm/arm-hisiv600-linux/bin/../lib/gcc/arm-hisiv600-linux-gnueabi/4.9.4/../../../../arm-hisiv600-linux-gnueabi/bin/ld: cannot find -lucl
/opt/hisi-linux/x86-arm/arm-hisiv600-linux/bin/../lib/gcc/arm-hisiv600-linux-gnueabi/4.9.4/../../../../arm-hisiv600-linux-gnueabi/bin/ld: cannot find -lz
解决方法:在upx-3.91-src/src的Makefile中修改如下:
LIBS += -lucl -lz
修改为:
LIBS += -L $(UPX_UCLDIR)/lib -lucl -lz
备注:有博友说需要下载LZMA4.43库,但我未下载,正常编译可使用:
lzma库路径: http://nchc.dl.sourceforge.net/project/sevenzip/LZMA%20SDK/4.43/lzma443.tar.bz2
4、upx测试:
将upx.out拷贝到arm-hisiv600板子上,chmod 777 upx.out
[root]# ./upx.out -V
upx 3.91
UCL data compression library 1.03
Copyright (C) 1996-2013 Markus Franz Xaver Johannes Oberhumer
Copyright (C) 1996-2013 Laszlo Molnar
Copyright (C) 2000-2013 John F. Reiser
Copyright (C) 2002-2013 Jens Medoch
UPX comes with ABSOLUTELY NO WARRANTY; for details type 'upx.out -L'.
[root]#
压缩前:
[root]# ls -ll 123
-rwxr-xr-x 1 root root 13392 May 30 18:09 123
[root]#
[root]# ./upx.out 123
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2013
UPX 3.91 Markus Oberhumer, Laszlo Molnar & John Reiser Sep 30th 2013
File size Ratio Format Name
-------------------- ------ ----------- -----------
13392 -> 7948 59.35% linux/armel 123
Packed 1 file.
压缩后:
[root]# ls -ll 123
-rwxr-xr-x 1 root root 7948 May 30 18:09 123
还原:
[root]# ./upx.out -d 123
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2013
UPX 3.91 Markus Oberhumer, Laszlo Molnar & John Reiser Sep 30th 2013
File size Ratio Format Name
-------------------- ------ ----------- -----------
13392 <- 7948 59.35% linux/armel 123
Unpacked 1 file.
UPX相对gzexe不一定有压缩上的优势,但是其具有跨平台的优势。且UPX压缩之后的程序依然是一个ELF
文件,但gzexe压缩之后的程序是一个posix shell脚本(后部分是压缩后的程序二进制文件)。