天天看點

python連結器編譯器實作_一個連結器的實作「一」

為什麼要研究連結器?

于我來說,最主要的原因就是學習了。

去年差不多這個時候,我剛進入大學的計算機系,對于如何學習這個專業尚模糊不清。在開學一個月左右的時候,學院為了探索教學改革,要組建一個虛拟的試驗班,讓一個老師給我們做了一次宣講(當時沒想到這個老師就是給我重大影響的韓老師)。他先說了一些他所遇見的大牛的例子,這些大牛的共同特征就是基礎特别好,對于計算機系統的底層非常了解。是以學院希望通過這個試驗班,做一些教學方面的探索,看能不能培養出基礎紮實的,更優秀的學生。還抛出了三個願望:作業系統,編譯器,資料庫,希望我們走一遍,不僅知道他們的運作機制,還要能夠動手實踐出一個簡單可用的版本。

對韓老師說的打牢基礎的說法深以為然。現在IT方面的技術發展很快,封裝也是越來越抽象,如何在這種瞬息萬變之中積累下真正有用的知識技能,我想唯有以不變應萬變,摸清這些知識的根部,才是最好的學習方法。或許最後我們用于工作的是java,是python,是javascript。但是學習彙編,研究作業系統,編譯器,會讓我們對這些新技術知根知底,進而學習的速度。

如我研究連結器的參考書《程式員的自修養:連結,裝載與庫》的作者在序言中說的:

“我目前從事的工作和系統底層關系不是很大,現在最常用的都是web前端,MySql資料庫等這些應用層面的系統。雖然不是直接與系統底層打交道,但是之前的積累無時無刻不在幫助我取生如了解應用開發。比如MySql系統的記憶體和檔案系統的優化,如果對作業系統的虛拟儲存和檔案系統機制沒有深入了解,那麼可能隻能在配置參數上做一些“猜測”性質的調整,不斷地嘗試各種參數,或者參考網絡上别人提供的配置參數,但不一定适合自己的應用情況。了解虛存如何運作,程序位址空間的分布等,将會對應用的優化,甚至是架構設計上都會有更高層次的俯視。“

目标:

一個可用的C連結器,可以連結MiniCRT(64位版)

資料:

Oracle的《連結程式和庫指南》

《程式員的自我修養:連結,轉載與庫》

Google

工具:

archlinux 64位版

eclipse + cdt

readelf

objdump

ghex

nm

gcc

ld

edb

這個系列的更新我會同時發在部落格園和我的獨立部落格上:nanshu.pw