使用Mingw编译UPX工具

起因

最近有使用到UPX工具,UPX是非常优秀的可执行程序压缩的工具,压缩比在50%到70%之间,最主要的还是跨平台的.具体的看 UPX .

这里主要在Windows上使用MingW编译.

UPX依赖关系

upx分别依赖ucl和lzma两个组件

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/

遇到下图:

 your compiler passes the ACC conformance test

遇到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运行效果,upx --help
后边就是将upx生成静态库,便于后面制作打包工具.
秋风 2019-07-26