分类:
2008-10-09 16:39:06
VC编译出来的东西有时很大,这主要的原因有以下几个原因:
1.因为有Runtime Library,不管你要不要,都给你塞进去。所以,想瘦身就要替换RTL。这个问题,你如果看看MSDN里关于VC LINKER的文档,你就会知道是怎么回事,该怎么做啦。
2.连接时缺省段对齐为4k。
为了瘦身,用以下方法:
1、用自己程序中的入口替换RTL中的WinMainCRTStartup
2、连接时指定段以512字节的边界对齐(缺省是4K)
3、连接时合并数据段和Raw data段到代码段。
这样生成的可执行文件大小为1K。
在命令行下,连接命令为:
cl/O1 /Zl ×.cpp /link /align:0x200 /nodefaultlib /entry:WinMainCRTStartup /merge:.data=.text /merge:.rdata=.text user32.lib ernel32.lib
源程序
//smallwinexe.cpp
#include "windows.h"
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MessageBox(NULL,"Hello,world!","SmallEXESize",MB_OK);
return 0;
}
void _cdecl WinMainCRTStartup(void)
{
int mainret;
char *lpszCommandLine;
STARTUPINFO StartupInfo;
lpszCommandLine = GetCommandLine();
if(*lpszCommandLine =='"')
{
while(*lpszCommandLine&&(*lpszCommandLine!='"'))
lpszCommandLine++;
if(*lpszCommandLine =='"')
lpszCommandLine++;
}
else
{
while(*lpszCommandLine>' ')
lpszCommandLine++;
}
while(*lpszCommandLine&&(*lpszCommandLine <=''))
lpszCommandLine++;
StartupInfo.dwFlags = 0;
GetStartupInfo( &StartupInfo );
mainret=WinMain(GetModuleHandle(NULL),
NULL,
lpszCommandLine,
StartupInfo.dwFlags&STARTF_USESHOWWINDOW
?StartupInfo.wShowWindow:SW_SHOWDEFAULT);
ExitProcess(mainret);
}