關於目標文件的一些讀書筆記

    今天看到一句話:真正了不起的程序員對自己的程序的每一個字節都瞭如指掌。覺得非常好,幾天前也聽到一同學對“精通”一詞的理解:精通就是能自己拿下小項目,能與大家合作大項目。都很有道理,對於程序,既要有理解,也能把自己的想法表現出來。

        目標文件:編譯器編譯源代碼後生成的文件叫做目標文件。從結構上講,目標文件是已經編譯過的可執行文件格式,只是還沒有經過鏈接的過程而已,其中可能有些符號或有些地址還沒有被調整。因爲它本身就是按照可執行文件的格式存儲的,只是跟真正的可執行文件在結構上稍有不同。因此,在Linux下,我們可以將它們統稱爲ELF(executable linkable format)文件,在Windows下統稱爲PE(portable executable)文件,它們都是COFF(Common file format)格式的變種。不光是可執行文件按照可執行文件格式存儲,動態鏈接庫及靜態鏈接庫文件都按照可執行文件格式存儲。它們在Windows下按照PE格式存儲,Linux下按照ELF格式存儲,靜態鏈接庫稍有不同,它是把很多目標文件捆綁在一起形成一個文件,再加上一些索引,可以簡單地把它理解爲一個包含有很多目標文件的文件包。

       目標文件與可執行文件格式跟操作系統和編譯器密切相關,所以不同的系統平臺下會有不同的格式,但這些格式又大同小異,目標文件格式與可執行文件的歷史幾乎是操作系統的發展歷史。

         COFF是由Unix System V Release 3首先提出並且使用的格式規範,後來微軟公司基於COFF格式,制定了PE格式標準,並將其用於當時的Windows NT系統。Unix System V Release 4在COFF基礎上引入了ELF格式,目前流行的Linux系統也以ELF作爲基本可執行文件格式。這也就是爲什麼目前PE和ELF如此相似的主要原因,因爲它們都是源於同一種可執行文件格式COFF.

        Unix最早的可執行文件格式爲a.out格式,它的設計非常地簡單,以至於後來共享庫這個概念出現的時候,a.out格式就變得捉襟見肘了。於是人們設計了COFF格式來解決這些問題,這個設計非常通用,以至於COFF的繼承者到目前還在被廣泛地使用。COFF的主要貢獻是在目標文件裏面引入了“段”的機制,不同的目標文件可以擁有不同數量及不同類型的“段”。另外,它還定義了調度數據格式。

        目標文件的內容至少有編譯後的機器指令代碼、數據,除了這些內容外,目標文件還包括了鏈接時所需要的一些信息,比如符號表、調試信息、字符串等。一般目標文件將這些信息按不同的屬性,以“節”(section)的形式存儲,有時候也叫“段”(segment)。

        其實我認爲了解計算機的一些歷史是很有用的,雖然它不能從本質上提高我們的編程能力,但它卻能夠告訴我們計算機爲什麼會是現在這樣,我覺得這是個很有趣的問題。以上的大部分內容也是摘抄自《程序員的自我修養》這本書裏面,確實是一本講“修養”的書,寫得非常細緻,寫寫內容,算是幫助自己複習和理解內容吧。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章