upx(the Ultimate Packer for eXecutables),是一款对可执行程序进行加壳脱壳工具,目的在于压缩程序,节省磁盘空间。应用程序在加壳后,仍可以执行,执行时,解压后动态加载到内存执行。
目的:将upx源码交叉编译,放到ARM开发板上使用。
过程:
1、下载upx-3.91-src.tar.bz2 http://upx.sourceforge.net/download/upx-3.91-src.tar.bz2,解压。编译upx需要ucl库、lzma库、zlib库。所以,
下载ucl-1.03.tar.gz http://down1.chinaunix.net/distfiles/ucl-1.03.tar.gz
下载lzma-4.32.7.tar.gz(网上有说需要下载lzma443,我下载以后,编译后,没有得到lzma的库文件,需要修改Makefile,链接归档成库文件。这种方法我暂时还没有试,先用lzma432吧)http://tukaani.org/lzma/lzma-4.32.7.tar.gz
下载zlib-1.2.3.tar.gz http://202.102.94.31/1/ishare.down.sina.com.cn/14708428.gz?ssig=sYSPd1AgTC&Expires=1386345600&KID=sina,ishare&fn=zlib-1.2.3.tar.gz&corp=1
2、设置交叉工具链
添加两行到/etc/profile中:
export PATH=$PATH:/home/open-wrt/trunk/staging_dir/toolchain-arm_v5te_gcc
export STAGING_DIR=/home/open-wrt/trunk/staging_dir/toolchain-arm_v5te_gc
如果没有设置STAGING_DIR,编译程序时,使用ubuntu系统中默认的库文件。
source /etc/profile
3、编译ucl
./configure --host=arm-openwrt-linux-gnueabi --prefix=$PWD/../upx-3.91-src/build --enable-static
make
make install
4、编译lzma-4.32.7
./configure --host=arm-openwrt-linux-gnueabi --prefix=$PWD/../upx-3.91-src/build --enable-static
make
make install
5、编译zlib库
由于zlib的configure配置不支持交叉编译选项。所以配置命令为
CC=arm-openwrt-linux-gnueabi-gcc CPP="arm-openwrt-linux-gnueabi-gcc -E" AR="arm-openwrt-linux-gnueabi-ar rc" RANLIB=arm-openwrt-gnueabi-ranlib ./configure --prefix=$PWD/../upx-3.91-src/build
make
make install
6、编译upx-3.91
修改Makefile:
LIBS += $(addprefix -L,$(dir $(wildcard $(UPX_UCLDIR)/libucl$(libext) $(UPX_UCLDIR)/src/.libs/libucl$(libext))))
修改为
LIBS+= $(UPX_UCLDIR)/lib
编译upx-3.91:
CXX=arm-openwrt-linux-gnueabi-g++ UPX_UCLDIR=$PWD/build UPX_LZMADIR=$PWD/build make all
如果lzma使用lzma443,那么
CXX=arm-openwrt-linux-gnueabi-g++ UPX_UCLDIR=$PWD/build UPX_LZMADIR=$PWD/../lzma-443 UPX_LZMA_VERSION make all