瘦身你的执行文件[原创]

原创 2004年10月18日 08:57:00
 瘦身你的执行文件[原创]

在网上,有好多绿色软件,不仅功能强大,而且软件本身的体积非常小。有的通常
只在几十K左右。那他们是怎么做到把软件做的怎么小的呢?现在我手把手的告诉
你如何通过修改程序的编译选项来瘦身你的执行文件。

先看一个最典型的程序:
#include <stdio.h>
int main()
{
printf("Hello, World!/n");
return 0;
}

上面的程序之所以被称之为典型,是因为他有如下的内容:
1、系统函数调用:printf
2、有静态数据段

好,现在把此文件放到VisualStudio6.0中进行编译,看看文件有多大。
1、用VisualStudio6.0打开HelloWorld.cpp文件,直接按F7。然后点击OK,生成
Project文件,然后进行编译。编译完成了以后,看看Debug目录下的执行文件的大
小,为172,096Bytes。

2、刚才编译的Debug文件,现在修改成Release文件看看。选择Win32 Release,再
编译。察看执行文件大小,现在成了40,960Bytes。看来Release版本的要比Debug
的小。

3、检查代码优化:发现执行文件的优化是Maximize Speed。那么修改成Minimize
Size看看。重新编译,得到执行文件的大小为:40,960Bytes。看来大小没什么变
化。其实这是由于我们的代码本身太小的缘故,导致即使变化了也看不出来。

4、想想我们程序的main函数是由CRT类库进行引导的。在我们现在的设定当中,由
于采取的是系统缺省的编译连接方式(缺省为编译为Single Thread,Static
Library),所以,在我们的执行文件当中,包含了CRT的二进制代码。好,修改编
译选项:C/C++ => Category:Code Generation => Use run-time
library:MutiThreaded Dll。编译看看:执行文件大小变成了16,384Bytes。

5、刚才的设定确实不错,一下子把执行文件大小减小到了16K。现在用UltraEdit
看看执行文件都是些什么内容。结果大吃一惊:基本上都是0。看来这个有减小的
必要了。都知道,执行文件都有自己的代码段,数据段等等,每个段的大小也是采
用编译器缺省设定的。好,我们来修改一下段的大小看看:
5.1 连接选项中有一个是/opt:nowin98,意思是将段的大小设定成为Win2000适应
的。编译看看:哇塞,变成了2,560byte。看来这个选项确实把文件变小了N多。
5.2 在查察连接选项中还有没有什么特别的。发现/align:xx还可以将段大小缩
小。通过UltraEdit察看刚才/opt:nowin98编译出来的文件,发现每个段的大小都
是4K的整数倍。看来/align:xx还有减小的趋势。试一把再说:添加连接选项:
/align:16(这个大小已经是能够设定的最小的了)。看看结果:1,408Bytes。厉
害,现在代码更小了。
5.3 现在回想起来,执行文件大小有数据段,执行代码段等等,如果把这些段都合
并起来,是不是就会把段之间的冗余有减小了呢?再试试看:添加选项:
/merge:.data=.text /merge:.rdata=.text。再看看文件大小:1,328bytes。真的
很不错了。

6、刚才的设定确实不错,似乎达到了我们想要的极限了。但是回头想一下,如果
没有CRT库的话,会不会更小了?实际上确实这样。添加连接选项: /entry:
main,把入口地址直接指向我们的main函数看看。得到592Bytes。

最终我们得到我们最后的大小592Bytes了。我想这也许是我们通过编译器能够编译
出来的最小的代码了。

结论:
通过上述的步骤,我们了解了如何修改那些编译连接选项来达到执行文件瘦身的目
的。但是,通常来讲,在我们的Release文件当中,并不需要如此小的执行文件。
如果想达到瘦身的目的,修改为library:MutiThreaded Dll和添加/opt:nowin98已
经是很好的选择了。其他别的选项在编译的时候或多或少的有警告出现,而且,带
有那些编译选项编出来的执行文件也不一定在各个平台上能够适用。

另外:如果你的执行文件即使通过了这些设定还是比较大的话,也可以通过一些
EXE文件压缩工具来进行压缩。比如UPX等等。在此不再细说了。

以上部分的不足之处,还请多多指正。

tuyang 2004/09/20

[授权发表]为可执行文件“减肥”

这是开源书籍[《C语言编程透视》](http://www.tinylab.org/project/hello-c-world/)第八章,如果您喜欢该书,请关注我们的新浪微博[@泰晓科技](http:/...
  • hifalcon
  • hifalcon
  • 2015年04月12日 17:52
  • 1134

瘦身你的执行文件

 在网上,有好多绿色软件,不仅功能强大,而且软件本身的体积非常小。有的通常只在几十K左右。那他们是怎么做到把软件做的怎么小的呢?现在我手把手的告诉你如何通过修改程序的编译选项来瘦身你的执行文件。先看一...
  • max0301
  • max0301
  • 2006年11月30日 09:55
  • 503

Virtual Box虚拟机文件瘦身处理

今天,突然发现配置在virtual Box虚拟机启动出错!根据错误信息提示是磁盘满了,紫萱一看虚拟机文件所在的D:盘全部被占用了。查找资料后得出结论,由于虚拟机文件在虚拟系统中删除东西后,实际占用的空...
  • huangge1199
  • huangge1199
  • 2017年12月02日 22:48
  • 178

PDF文件瘦身

今天一个朋友问我要1个PDF文件,其实他只要里面的某一章内容,如果把整个PDF发给他,未免有点浪费,因为整个文件足足有20多M,公司的网络又不快。于是我用Acrobat复制了这个PDF,然后把不相关的...
  • broze
  • broze
  • 2008年08月04日 17:32
  • 5274

apk “减肥”

总结一下我使用过的方法 1,
  • xiebudong
  • xiebudong
  • 2014年09月29日 15:26
  • 3183

sqlserver2008的数据库文件瘦身

server 数据库通常有两个文件:XXX.mdf 和XXX_log.LDF时间长了,XXX_log.LDF会变更很大。首先,在数据库管理工具 sqlserver management stiduo ...
  • shuicaohui5
  • shuicaohui5
  • 2010年11月30日 21:10
  • 1695

iOS安装包瘦身方法?

一、删除无用资源 删除1x图片,无需适配iPhone4以下机型 现在应该没有APP需要支持iPhone4以下的机型了,所以1X的图片可以全部删掉。3X的图片是保留还是删掉看具体情况。 未使用的图片通...
  • M_nao
  • M_nao
  • 2017年02月25日 22:28
  • 547

如何给SVN版本库瘦身

当svn库庞大到一定程度的时候,无论是在查询还是在备份方面肯定会给我们带来很多不便,对于有把SVN版本库随身携带到移动硬盘的朋友来说,这更是一个大麻烦。我就遇到了。 最近我的移动硬盘空间严重不足,找来...
  • caoshiying
  • caoshiying
  • 2016年11月19日 12:18
  • 1231

App瘦身最佳实践(分析了微信、淘宝、微博图片文件的放法)

本文会不定期更新,推荐watch下项目。如果喜欢请star,如果觉得有纰漏请提交issue,如果你有更好的点子可以提交pull request。 本文的示例代码主要是基于作者的经验来编写的,若你有其...
  • pengpenggxp
  • pengpenggxp
  • 2016年09月21日 17:30
  • 2188

Java虚拟机详解03----常用JVM配置参数

文章来源:http://www.cnblogs.com/smyhvae/p/4736162.html   本文主要内容: Trace跟踪参数堆的分配参数栈的分配参数   ...
  • derek518
  • derek518
  • 2016年12月22日 14:10
  • 273
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:瘦身你的执行文件[原创]
举报原因:
原因补充:

(最多只允许输入30个字)