1. 程式人生 > >如何減少exe,dll大小

如何減少exe,dll大小

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位元組.

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就沒有辦法不用執行庫了.

more:感覺另外還有應該儘量少用全域性和靜態變數,他們會被直接編譯到PE檔案的資料(.data, .rdata)段中;另外圖片等資源也挺耗空間,簡單的圖片可以在執行時自己畫出來。