程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> vc的編譯參數優化

vc的編譯參數優化

編輯:vc教程

      Author: void#ph4nt0m.org
*/

// 編譯器 cl.exe(Visual C++ 6.0)
// 沒有做任何優化情況下,編譯大小為:16K
// 編譯優化後: 1K (用16進制編輯器把尾部的0x00去掉: 712bytes)
#include <Windows.h>
#pragma comment(lib,"kernel32.lib")

// 作用: 指定節對齊為512字節
#pragma comment(linker, "/align:512")

// 作用: 合並節
// 將.data節和.rdata節合並到.text節(代碼節)
#pragma comment(linker, "/merge:.data=.text")
#pragma comment(linker, "/merge:.rdata=.text")

// 作用: 指定子系統為Windows (和優化無關)
// vc編譯器默認是console,會有個黑糊糊的CMD窗口,不好看.用Windows就好了
#pragma comment(linker, "/subsystem:Windows")

// 作用: 指定入口函數
// 子系統為Windows的默認入口點WinMain和console的默認入口點main,都會引入一段啟動stub代碼,指定入口函數可去掉之.
#pragma comment(linker, "/ENTRY:main")


//int WinMain(HINSTANCE current, HINSTANCE prev, LPSTR cmdline, int showcmd)

// 作用: 去掉函數的棧幀代碼,純屬吹毛求疵:-)
// 即函數開頭的push ebp / mov ebp, esp和結尾的pop ebp / retn
__declspec(naked)
void main()
{
      // 調用wmp. 這是按套路出牌的方法.
      //typedef VOID (__stdcall *fnRunDllW)(HWND, HINSTANCE, LPCWSTR, DWord);
      //((fnRunDllW)GetProcAddress(LoadLibrary("msdxm.ocx"), "RunDllW"))(0,0,0,0);

    // 不按套路出牌,不壓入RunDllW的函數參數,直接調用.
      GetProcAddress(LoadLibrary("msdxm.ocx"), "RunDllW")();
      // 注意此時的堆棧是不平衡的.
      // 但是通過ExitProcess()退出自身,就不用去考慮平衡了.
      ExitProcess(0);
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved