本文通過實驗還原 TC 2.0 從源碼到 .exe 的完整工具鏈,演示 TLIB 靜態庫操作與運行時庫替換技術。
TCC 默認兩步:.c → .obj(編譯),TLINK .obj + c0s.obj + cs.lib + emu.lib + maths.lib → .exe(鏈接)。-c 選項(Compile only)僅生成 .obj,不鏈接。單文件缺少 f() 定義會報錯。將 f() 放入 4_1.c,命令 tcc a.c 4_1.c 成功生成 a.exe。證明鏈接器從多個 .obj 解析符號。
tlib cs.lib + 4_1.obj:將 4_1.obj 中所有函數加入 cs.lib。a.c 無需 4_1.c,鏈接器自動從 cs.lib 提取 f() 代碼。main 中 call f 跳轉至庫中代碼。f1/f2/f3 定義在 f.c,編譯為 f.obj 加入 cs.lib。b.c 僅調用 f1/f2,生成 b.exe 後,反彙編發現 僅包含 f1/f2 代碼,無 f3。f3.obj 加入庫,未調用時不進可執行文件;調用後緊跟在 f2 後。.obj 為粒度鏈接,「用到哪個函數,裝入哪個函數」,極大減小體積。tlib cs.lib -+ printf.obj:-+ 替換庫中同名模塊。printf,輸出為自定義版本(「這是我的printf」)。.obj,減少符號缺失錯誤。這套機制是現代鏈接器(GNU ld, MSVC link)按節區粒度鏈接(-ffunction-sections -fdata-sections --gc-sections)的雛形。