為什麼要研究連結器?
于我來說,最主要的原因就是學習了。
去年差不多這個時候,我剛進入大學的計算機系,對于如何學習這個專業尚模糊不清。在開學一個月左右的時候,學院為了探索教學改革,要組建一個虛拟的試驗班,讓一個老師給我們做了一次宣講(當時沒想到這個老師就是給我重大影響的韓老師)。他先說了一些他所遇見的大牛的例子,這些大牛的共同特征就是基礎特别好,對于計算機系統的底層非常了解。是以學院希望通過這個試驗班,做一些教學方面的探索,看能不能培養出基礎紮實的,更優秀的學生。還抛出了三個願望:作業系統,編譯器,資料庫,希望我們走一遍,不僅知道他們的運作機制,還要能夠動手實踐出一個簡單可用的版本。
對韓老師說的打牢基礎的說法深以為然。現在IT方面的技術發展很快,封裝也是越來越抽象,如何在這種瞬息萬變之中積累下真正有用的知識技能,我想唯有以不變應萬變,摸清這些知識的根部,才是最好的學習方法。或許最後我們用于工作的是java,是python,是javascript。但是學習彙編,研究作業系統,編譯器,會讓我們對這些新技術知根知底,進而學習的速度。
如我研究連結器的參考書《程式員的自修養:連結,裝載與庫》的作者在序言中說的:
“我目前從事的工作和系統底層關系不是很大,現在最常用的都是web前端,MySql資料庫等這些應用層面的系統。雖然不是直接與系統底層打交道,但是之前的積累無時無刻不在幫助我取生如了解應用開發。比如MySql系統的記憶體和檔案系統的優化,如果對作業系統的虛拟儲存和檔案系統機制沒有深入了解,那麼可能隻能在配置參數上做一些“猜測”性質的調整,不斷地嘗試各種參數,或者參考網絡上别人提供的配置參數,但不一定适合自己的應用情況。了解虛存如何運作,程序位址空間的分布等,将會對應用的優化,甚至是架構設計上都會有更高層次的俯視。“
目标:
一個可用的C連結器,可以連結MiniCRT(64位版)
資料:
Oracle的《連結程式和庫指南》
《程式員的自我修養:連結,轉載與庫》
工具:
archlinux 64位版
eclipse + cdt
readelf
objdump
ghex
nm
gcc
ld
edb
這個系列的更新我會同時發在部落格園和我的獨立部落格上:nanshu.pw