使用Mingw编译UPX工具
起因
最近有使用到UPX工具,UPX是非常优秀的可执行程序压缩的工具,压缩比在50%到70%之间,最主要的还是跨平台的.具体的看 UPX .这里主要在Windows上使用MingW编译.
![upx分别依赖ucl和lzma两个组件 upx分别依赖ucl和lzma两个组件]()
![upx运行效果,upx --help upx运行效果,upx --help]()
UPX依赖关系
UPX相关下载,这里尽量使用git
git clone https://github.com/upx/upx.git
cd upx
git clone https://github.com/upx/upx-lzma-sdk.git lzma-sdk
关于ucl,这个要手动下载(采用浏览器,主要MingW没安装wget)
http://www.oberhumer.com/opensource/ucl/download/ucl-1.03.tar.gz
ucl 解压和编译
进行解压tar -xzvf ucl-1.03.tar.gz
cd ucl-1.03
开始编译
./configure --prefix=/e/opensource/mymono/upx/
遇到下图:
遇到ACC一致性测试失败.在网上找资料说是gcc的一个bug,在GCC 6的时候,我本地上gcc是9.1.0,最后找到解决方法.关于 GCC 版本 6.1.0 及更高版本的注意事项在这里
具体解决方法: https://github.com/mxe/mxe/commit/0ac2a77
查看config.log,看ACC error在哪里出现的.主要看gcc 编译conftest.c参数.
然后在configure文件中,查找CFLAGS为-g -O2,并在后面加上-std=gnu90 -fPIC
if test "$ac_test_CFLAGS" = set; then
CFLAGS=$ac_save_CFLAGS
elif test $ac_cv_prog_cc_g = yes; then
if test "$GCC" = yes; then
CFLAGS="-g -O2 -std=gnu90 -fPIC"
else
CFLAGS="-g"
fi
else
if test "$GCC" = yes; then
CFLAGS="-O2 -std=gnu90 -fPIC"
else
CFLAGS=
fi
fi
编译UPX
make all UPX_UCLDIR=/e/opensource/mymono/upx/ucl-1.03 UPX_LZMADIR=./src/lzma-sdk
找到src目录中,找upx.out文件,将out后缀改为exe.可以在编译之前去src目录下,在Makefile修改生成文件的后缀名.
UPX 运行效果
后边就是将upx生成静态库,便于后面制作打包工具.
秋风
2019-07-26