一個連接器的實現「一」

爲何要研究連接器?

  於我來講,最主要的緣由就是學習了。javascript

  去年差很少這個時候,我剛進入大學的計算機系,對於如何學習這個專業尚模糊不清。在開學一個月左右的時候,學院爲了探索教學改革,要組建一個虛擬的試驗班,讓一個老師給咱們作了一次宣講(當時沒想到這個老師就是給我重大影響的韓老師)。他先說了一些他所碰見的大牛的例子,這些大牛的共同特徵就是基礎特別好,對於計算機系統的底層很是瞭解。因此學院但願經過這個試驗班,作一些教學方面的探索,看能不能培養出基礎紮實的,更優秀的學生。還拋出了三個願望:操做系統,編譯器,數據庫,但願咱們走一遍,不只知道他們的運行機制,還要可以動手實踐出一個簡單可用的版本。前端

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

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

  「我目前從事的工做和系統底層關係不是很大,如今最經常使用的都是web前端,MySql數據庫等這些應用層面的系統。雖然不是直接與系統底層打交道,可是以前的積累無時無刻不在幫助我取生如理解應用開發。好比MySql系統的內存和文件系統的優化,若是對操做系統的虛擬儲存和文件系統機制沒有深刻了解,那麼可能只能在配置參數上作一些「猜想」性質的調整,不斷地嘗試各類參數,或者參考網絡上別人提供的配置參數,但不必定適合本身的應用狀況。瞭解虛存如何運做,進程地址空間的分佈等,將會對應用的優化,甚至是架構設計上都會有更高層次的俯視。「linux

目標:

  一個可用的C連接器,能夠連接MiniCRT(64位版)程序員

資料:

  1. Oracle的《連接程序和庫指南》
  2. 《程序員的自我修養:連接,轉載與庫》
  3. Google

工具:

  1. archlinux 64位版
  2. eclipse + cdt
  3. readelf
  4. objdump
  5. ghex
  6. nm
  7. gcc
  8. ld
  9. edb

這個系列的更新我會同時發在博客園和個人獨立博客上:nanshu.pwweb

相關文章
相關標籤/搜索