原帖:http://blog.csdn.net/davemin/archive/2006/09/26/1289795.aspx
1. 普通Exe 檔案
完全可以使用下面方法:
A. link標記: /nodefaultlib
代表: Ignore all default libraries
包括執行階段程式庫, 都不用.
當然如果大家要用相關c執行階段程式庫的api 怎麼辦呢?
可以使用相關對應的API, 比如strcmpi, 使用lstrcmpi, 詳細請參考下表:
| Standard function |
Win32 equivalent |
| malloc |
HeapAlloc |
| free |
HeapFree |
| strcpy |
lstrcpy |
| strcat |
lstrcat |
| strncpy |
lstrncpy |
| strncat |
lstrncat |
| strlen |
lstrlen |
| strcmp |
lstrcmp |
| strcmpi |
lstrcmpi |
| memcpy |
CopyMemory |
| memset |
FillMemory or ZeroMemory |
| memmove |
MoveMemory |
| toupper |
CharUpper |
| tolower |
CharLower |
| isalpha |
IsCharAlpha |
| isalnum |
IsCharAlphaNumeric |
| islower |
IsCharLower |
| isupper |
IsCharUpper |
| sprintf |
wsprintf |
| vsprintf |
wvsprint |
B. 設定串連節大小及其他
加入下面代碼到cpp檔案就可以.
#ifndef _DEBUG
#pragma comment(linker, "/FILEALIGN:16")
#pragma comment(linker, "/ALIGN:16")
#pragma comment(linker, "/OPT:REF")
#pragma comment(linker, "/OPT:ICF")
#pragma comment(linker, "/OPT:NOWIN98") // 使用老VC編繹器的512大小為一節
// 合并段
#pragma comment(linker, "/MERGE:.rdata=.data")
#pragma comment(linker, "/MERGE:.text=.data")
#pragma comment(linker, "/MERGE:.reloc=.data")
// Favour small code
#pragma comment(linker, "/ENTRY:WinMain")
#endif
如果是少量代碼的Exe 程式, 最終大小可以在1500 位元組以內.
我曾寫過一個程式使用了檔案讀寫, 執行進程, 字元運算, 等等一共50多行代碼, 最終大小為: 1488位元組.
C. 不幸的是可能還是要使用c運行庫
那可以使用這個 LIBCTINY.LIB檔案, 以盡量減小. 當然這個lib 本身包括不多的運行庫api.
LIBCTINY.LIB 檔案以及來源程式參考:
http://msdn.microsoft.com/msdnmag/issues/01/01/hood/default.aspx
2. 普通Dll 大小問題
因為: __DllMainCRTStartup 或: _DllMainCRTStartup 要調用執行階段程式庫
還好, LIBCTINY.LIB 裡面已經有相關實現, 可以用LIBCTINY.LIB, 而不用調用運行庫了. 這樣可以大大減小.
串連設定:
#ifndef _DEBUG
// default lib setting.
#pragma comment(linker, "/defaultlib:kernel32.lib")
#pragma comment(linker, "/defaultlib:LIBCTINY.LIB")
#pragma comment(linker, "/nodefaultlib:libc.lib")
#pragma comment(linker, "/nodefaultlib:libcmt.lib")
// section size
#pragma comment(linker, "/FILEALIGN:16")
#pragma comment(linker, "/ALIGN:16")
#pragma comment(linker, "/OPT:NOWIN98")
// 合并段
#pragma comment(linker, "/MERGE:.rdata=.data")
#pragma comment(linker, "/MERGE:.text=.data")
#pragma comment(linker, "/MERGE:.reloc=.data")
#endif
另外我的測試程式中匯出了一個介面
BOOL _stdcall ExpHook( )
{
return 0;
}
最終大小為: 992位元組.
3. 複雜Dll 和複雜Exe 大小問題
如果你的程式一定要使用MFC, 那怎麼編繹至少也有幾十KB了.
但你還是可以用相關PE壓縮程式壓縮一下的. 至少能壓縮到50%.
如果是COM, 建議不要使用MFC, 如果使用ATL, 可以使用壓縮程式壓縮一下, 基本會在20-40K 大小.
複雜類型的Dll, Exe 肯定是要使用運行庫的. 像用了ATL就沒有辦法不用運行庫了.