程式碼很簡單如下:
#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目前是拔不掉的.