Introduction


A few days back I was assigned a challenging task of writing a Win32 application performing tasks (as defined by our client). But the client required that the final exe file size to be less than 50K. With this kind of size limit we immediately had to give up an MFC based solution, a tough decision to make in most cases :). I am very comfortable with MFC and never had bothered about final file size. But for this specific project I had to dig into pure Win32 SDK to get things done. The project was started and the first prototype was sized about 36K and everyone was happy. But problems were raised when we started implementing the user requirements and one day we found that the size of the exe file in release mode had exceeded the 50K limit. And when the final product was about to be shipped the size had reached about 72K. We were thinking about re-nagotiating the size limit with our client. Fortunately I posted a question on one of the Microsoft news threads and got some prompt replies. I tried to test the instructions that I received from the news thread on my application, and the result were simply amazing, my file size reduced to 35K resulting in about 50% files size reduction. We were happy and so was our client :)

So what are those magic tricks? Actually all you have to do is to instruct compiler to leave out unnecessary code from your application. If you create a simple HelloWorld Win32 Application from the app wizard and compile it in release mode, the resulting exe file size is 24K. Too much for a simple "Hello World" application. Now, perform the following steps:

Create another similar project workspace, i.e. another "Hello World" project.

Select active build configuration to be "Win32 Release".

Open project setting and select the "Link" tab. Remove all the library file names from the "Object/library modules:" edit box and type "MSVCRT.LIB kernel32.lib user32.lib". Press OK and compile, the final exe file size is reduced to 16K. You might get a linker warning like "LINK : warning LNK4098: default lib "LIBC" conflicts with use of other libs; use /NODEFAULTLIB:library". This can be avoided by clicking "Ignore all default libraries" from the Link tab of Project Settings.

The further magic is done by using /ALIGN linker option. You can see MSDN for further details about this linker option. Again go to the "Project Settings", "Link" tab. Type /ALIGN:4096 in the Project Options edit box. Press OK and rebuild your project. The size is further reduced to 3K. The compiler generates a linker warning "LINK : warning LNK4108: /ALIGN specified without /DRIVER or /VXD; image may not run". If you have followed my instructions properly, your exe file should run properly. I played around with the /ALIGN linker directive and figured out that if you use /ALIGN:4096 the produced exe file runs properly.

That's it, we have reduced size of our Hello World app from 24K to 3K. There are some other options that you can try in this regard:

You can run some symbol stripper utility on the final exe file. It helps reducing size in many cases. One such utility can be found at neoworx.com.

There is a utility named ASPack, this utility also helps in compressing your exe files up to 50%.


MFC
I haven't yet tried these tricks with MFC projects, so results are unpredictable. But that should not stop you from trying these options on MFC projects.