2014 12 11 01 04 [程式] 用 MinGW gcc 去編譯一個最小的exe檔

程式碼很簡單如下:

#include <windows.h>
void __main () {
    WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),"Hello World!",12, NULL,NULL);
}

在console上印出Hello World!.

比較複雜的倒是gcc編譯的參數如下:
gcc mini_exe.c -s -fno-asynchronous-unwind-tables  -nostartfiles -nodefaultlibs -nostdlib -lkernel32 -Wl,--section-alignment,0x1000 -Wl,--file-alignment,0x200

這樣會產生一個2048bytes的a.exe,
目前還沒找出方法把section合併起來.
這是目前可以做出來最小的exe檔了...

當然,如果你把印出Hello World!的部分都移除,是可以得到更小的exe檔(1536bytes).

更新 (2014/12/11):
找到可以把 section .data 合併到 section .text 的方法,
程式如下:
#include <windows.h>
#define __data __attribute__ ((__section__ (".text")))
char str[] __data = "Hello World!";
void __main () {
  WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),str,12, NULL,NULL);
}
這樣就可以編譯出1536bytes的exe檔了.

只是要把 section .idata 也合併進section .text就蠻難的.
目前看起來section .idata的資訊應該是記載在 libkernel32.a 裡面,
除非改動這個libkernel32.a, 要不然 section .idata目前是拔不掉的.