作者:陆麟
转载请征得作者同意.
1999.12.30
patched 2000.5.28
千僖之篇,糨糊之作.
我试了一下.一般情况下VC的最小编译出的EXE是24K,但是,如何能够获得最小的EXE文件呢?下面是我的代码:
void main()
{
}
按平时,这个代码编译出的文件已经是最小的PE文件.因为里面没有任何代码,没有任何数据,我们通过编译能够发现,EXE尺寸为24K.现在我们可以用VC的DEPENDENCY
VIEWER看一下.这么一个东西,里面居然引入的35个函数.问题就出在这里了.我并不要它完成任何工作.不需要他调用任何函数.那么这些东西为什么跑到EXE里了呢?
原来是VC的RTL搞的鬼.在我们的MAIN函数被调用前,RTL已经有一大堆的代码先于我们执行.现在,我们就绕过RTL,自己直接接管启动入口.在PROJECT
SETTING里,把LINKER的OUTPUT项里加上ENTRYPOINT为main.然后,设置/ALIGN:4096.这是缺省的SECTION的ALIGNMENT.然后LINKER的FILE
ALIGN自动变成了512.
现在BATCH BUILD出RELEASE版.1K的EXE出现了.
//以下未PATCH.
当然,一旦调用了任何函数,EXE的尺寸就至少变成12K.这有有什么原因呢?
我们的PE可执行文件入口其实以4K字节为一段,目前这个EXE文件尽管编译后只有RET1个字节的代码,但是由于段的原因我们仍然获得了8K的EXE文件(第一个段里乃是DOS
STUB和PE INFORMATION,第二个段才是PE的代码段)这第二个段的名字叫.text.当我们有了任何引用数据时,会至少增加一个.rdata节.甚至有.data节,由于每个段至少4K,累计起来就成了16K...
我注意到LCC居然不是按4K的边界LINK的,所以EXE可能不是正好4K的倍数(最后一个节被缩减了),但我用非4096的节来编译,编译通过后并不能执行.(只有DRIVER可以按照32字节的节边界编译并正常运行.所以很多NT
DRIVER尽管是PE文件,却小于4K.)