July 06, 2006

分析 GCC 對 Hello World 的重重布幕

最近花了些時間準備 [演講:深入淺出 Hello World -- 理解 Linux 上運作 Hello World 的種種機制 (台中場次)],"Hello World" 可以用許多程式語言撰寫,可參考 [433 Examples in 132 (or 162*) programming languages],編譯系統在這幾十年沒有太大的流程改變,但是應用類型與平台環境卻相當多元。

過去在 16-bit x86/DOS 的環境中,用 Turbo C 或 Turbo Pascal 撰寫一個 "Hello World",執行檔不需要 C runtime,並且也不到 1 kb 的大小,而事隔多年,在 32-bit x86/Win32 或 32-bit x86/Linux 上,隨便用 Microsoft C compiler 或 GNU GCC 編譯,卻有十幾 kb 之譜,重點是,這些執行檔都需要 C runtime 或者類似的 Dynamic Linking,這是怎麼一回事?16-bit 到 32-bit 的變遷中,對 code density 與 expansion 差異竟然如此大?而編譯技術反而退步了?非也、非也。

其實思維的角度已經改變,像 DWARF/ELF 執行檔格式之所以被提出,就是希望能增加一個系統的彈性,以及提昇動態偵錯的能力,面對這些重重布幕,不僅 Embedded System 的開發者需要留意,任何可能會接觸到 System Programming 的環節,也必定會遇到,甚至,許多安全性議題,就是深藏於這些布幕。準備演講內容的同時,試著修改一些工具,並加強輸出與報表的功能,以下是分析一個 C 語言撰寫的 Hello World 的畫面:(click to enlarge)

這是尋幽訪勝的一個方式,再來,我會試著用修改過的 [User-Mode-Linux] 搭配 GNU GDB,探索 kernel-space 與 user-space 的互動情況,順便介紹工具的使用。

先提到這邊,另外我想強調的是「處處留心皆學問,落花水面皆文章」,其實 geek 與一般的 user / programmer 的分野並不大,只是專注的範疇與態度有異罷了 :-)
由 jserv 發表於 July 6, 2006 03:33 PM
迴響

請問是用哪一個分析工具?? 非常謝謝您.

Nikle 發表於 July 6, 2006 07:27 PM

用 Microsoft C compiler的話, 主要還是由於CRT Init部份的code會被link進去.

Kuon 發表於 July 7, 2006 01:24 AM

To Nikle,

我會在演講時公佈,也會在結束後將相關資料 (slides, sample program, tools) 一併放到公開的網站上,謝謝您的關注。

jserv 發表於 July 7, 2006 10:16 AM

printf() 不也是 C Runtime 的函式嗎? 我記得在DOS下的Hello World (以Turbo C 編譯)好像也有十幾K, 不是很確定...

James 發表於 July 7, 2006 11:52 AM

James,剛才用庫存的Turbo C 2.01編Hello.c,只有5676 bytes,用upx 壓縮後,變成3856 bytes。用Cygwin是11977 bytes,strip後變成4608 bytes,再用upx壓成3072bytes。

鳥毅 發表於 July 11, 2006 01:54 PM