Chinaunix首页 | 论坛 | 博客
  • 博客访问: 214056
  • 博文数量: 64
  • 博客积分: 2010
  • 博客等级: 上尉
  • 技术积分: 720
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-25 19:03
文章分类

全部博文(64)

文章存档

2013年(1)

2012年(9)

2011年(25)

2010年(7)

2009年(16)

2008年(6)

分类:

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);  
  }  

 
阅读(416) | 评论(0) | 转发(0) |
0

上一篇:T1/E1

下一篇:vc6 生成最小的exe文件

给主人留下些什么吧!~~