int main() { return 0; }使用 gcc main.c -nostdlib -o main.exe 會報錯:
undefined reference to `__main'
-nostdlib 禁止鏈接標準庫與啟動文件,隱含 -nostartfiles 與 -nodefaultlibs。實驗發現:
-nostartfiles 時鏈接正常;-nodefaultlibs 會產生大量未定義符號錯誤。這說明啟動代碼(CRT)與標準庫符號(如 __main)分層提供,main 並非真正入口點。
OD 顯示 kernel32.dll 呼叫 mainCRTStartup,而非直接呼叫 main。單步執行關鍵節點:
GetVersion 獲取作業系統版本(主控台程式顯示 MS-DOS 版本資訊)。HeapCreate 初始化進程堆,內含 HeapDestroy 邏輯,確認此為堆初始化階段。GetCommandLineA 取得命令列參數首址。GetEnvironmentStringsW/GetEnvironmentStrings 獲取環境變數,並以 WideCharToMultiByte 轉換為多位元組字串。00401010 push ebp
00401011 mov ebp, esp
00401013 sub esp, 40h
00401016 push ebx
00401017 push esi
00401018 push edi
00401019 lea edi, [ebp-40h]
0040101C mov ecx, 10h
00401021 mov eax, 0CCCCCCCCh
00401026 rep stos dword ptr [edi] ; 棧框初始化,填充 0xCC
...
00401028 mov ecx, 10h
0040102D call __security_init_cookie
00401032 call _mainCRTStartup ; 真正入口
...
棧框建立、安全 Cookie 初始化、CRT 啟動流程一氣呵成。
_start(由連結器指定),負責初始化 CRT 再呼叫 main;Windows 對應 mainCRTStartup/WinMainCRTStartup。C 程式「從 main 開始」只是程式設計師的視角;作業系統與執行階段庫在 main 前完成了堆初始化、命令列/環境變數解析、安全機制佈防等關鍵工作。逆向分析啟動流程,能讓開發者建立更完整的底層執行模型,為效能優化、漏洞挖掘、嵌入式裸機開發打下堅實基礎。