昨天,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脚本(后部分是压缩后的程序二进制文件)。 原文链接

linux下编译upx ucl的更多相关文章

  1. linux下编译upx 3.93

    昨天,UPX发布了3.93版本. UPX(the Ultimate Packer for eXecutables)是一个非常全面的可执行文件压缩软件,支持dos/exe.dos/com.dos/sys ...

  2. linux下编译gcc6.2.0

    linux下编译gcc6.2.0 在archlinx的下gcc已经更新到6.2.1了,win10的WSL下还是gcc4.8.官方源没有比较新的版本,于是自己编译使用. GCC6的几个新特性 GCC 6 ...

  3. LINUX下编译安装PHP各种报错大集合

    本文为大家整理汇总了一些linux下编译安装php各种报错大集合 ,感兴趣的同学参考下. nginx1.6.2-mysql5.5.32二进制,php安装报错解决: 123456 [root@clien ...

  4. linux下编译安装vim7.4并安装clang_complete插件

    linux下编译安装vim7.4并安装clang_complete插件 因为debian里软件仓库中下载安装的vim是不支持python写的插件的(可以打开vim,在命令模式先输入:py测试一下),导 ...

  5. linux下编译出现空间不足解决办法

    linux下编译出现空间不足解决办法 编译内核出现问题: AS      .tmp_kallsyms1.o .tmp_kallsyms1.S:2: fatal error: when writing ...

  6. linux下编译安装curl

    linux下编译安装curl 1.下载curl git clone https://github.com/curl/curl.git 2.在curl目录下生成configure文件 ./buldcon ...

  7. 如何在Kali Linux下编译Windows Exploit

    前言 微软的Windows在企业或是个人应用领域占据着最大的市场份额,在渗透测试过程中你会经常遇到很多Windows的工作站和服务器.另一方面,大多数渗透测试人员主要使用基于Linux的发行版渗透测试 ...

  8. 如何用javac 和java 编译运行整个Java工程 (转载)【转】在Linux下编译与执行Java程序

    如何用javac 和java 编译运行整个Java工程 (转载)  http://blog.csdn.net/huagong_adu/article/details/6929817 [转]在Linux ...

  9. linux下编译qt5.6.0静态库——configure配置

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...

随机推荐

  1. PHP匿名函数

    PHP匿名函数 匿名函数(Anonymous functions),也叫闭包函数(closures),允许临时创建一个没有指定名称的函数.最经常用作回调函数(callback)参数的值. 举例: &l ...

  2. update layer tree导致页面卡顿

    前因 今天检查一个vue页面问题,就是在切换Tab时候(某些win10电脑),页面会卡顿一段很长的时间,短则3秒,长则十几秒,这个体验非常糟糕,于是我着手寻找其中原因. 概况 这个vue页面的元素非常 ...

  3. org.springframework.dao.InvalidDataAccessResourceUsageException: Unexpected cursor position change. Spring Batch 错误

    在用SpringBatch 跑job的时候出现这个错误, 由于取数据的DB 是netezza, 框架可能支持的不是很全面,当然也可能是其他原因. <bean id="reader_rd ...

  4. C和指针 (pointers on C)——第七章:函数(上)

    第七章 函数 这一章对于有一定C的基础的人有一定优秀代码风格的人来说,并非非常虐.关于stdarg宏可能有些陌生.它负责可变參数列表的定义. 总结: 新式风格和旧式风格就不要提了.八百年前的事情. 函 ...

  5. PHP操作Redis常用技巧总结

    一.Redis连接与认证 //连接参数:ip.端口.连接超时时间,连接成功返回true,否则返回false $ret = $redis->connect('127.0.0.1', 6379, 3 ...

  6. jQuery 短信验证码倒计时

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. mysql锁2

    死锁: 指两个事务或者多个事务在同一资源上相互占用,并请求对方所占用的资源,从而造成恶性循环的现象. 出现死锁的原因: 系统资源不足: 进程运行推进的顺序不当: 资源分配不当. 产生死锁的四个必要条件 ...

  8. 网站建设部署与发布--笔记2-部署Apache

    网站部署(Linux) 部署Apache 操作系统:CentOS 7.2 1.首先连接云服务器,清楚系统垃圾. $ yum clean all Loaded plugins: fastestmirro ...

  9. docker 13 dockerfile的保留字指令

    Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本. 构建三步骤:1.编写dockerfile文件:2.docker build:3.docker run doc ...

  10. ASP.NET Core - 关于Tag Helper值得了解的五点

    如果您开发过ASP.NET Core Web应用程序,您应该已经熟悉了Tag Helper.ASP.NET Core应用程序依赖Tag Helper来呈现表单和表单字段是很常见的.所以,一个视图通常包 ...