2012-05-21 46 views
4

最近我嘗試在自己的linux平臺上編寫一個簡單的編譯器。在不使用libelf或其他庫的情況下創建ELF二進制文件

當談到編譯器的後端時,我決定不使用第三方庫(如libelf)生成ELF格式的二進制文件。

相反,我想嘗試直接將機器代碼寫入到ELF ABI文件中,只需使用write()函數並控制ELF文件的所有細節。

這種方法的優點是我可以控制我的編譯器的一切。

但我很猶豫。考慮到ELF ABI的詳細程度,這種方式是否可行?

我希望有任何建議和指向可用的良好可用資源。

+6

是啊,舊的「我想要寫我自己的百科全書,因爲那時候我不擔心在一個任何錯誤這就是被同行審查,成千上萬人的校對 - 我可以做得更好「的論據。 –

+2

@Marc - 對於製作軟件,我完全同意。但是,如果您已經編寫自己的編譯器來學習編譯器編寫,那麼爲什麼不能一路走下去,自己做代碼生成和輸出。可能是一個非常有趣的學習經歷。 – QuantumMechanic

+0

這將是鏈接器的工作,而不是編譯器。 –

回答

5

這很容易/可行取決於你想支持的功能。如果你想使用動態鏈接,你必須處理符號表,重定位等。當然,如果你想能夠與現有的庫,甚至靜態鏈接,你將不得不支持他們需要的任何東西。但是如果你的目標是製作獨立的靜態ELF二進制文件,那真的很簡單。所有你需要的是一個主要的ELF頭文件(100%樣板文件)和2個PT_LOAD程序頭文件:一個載入你程序的代碼段,另一個載入它的數據段。理論上它們可以結合使用,但是安全強化的內核不允許給定的頁面既可寫也可執行,所以將它們分開是明智的。

一些建議閱讀:

http://www.linuxjournal.com/article/1059

+1

Thannks爲您的建議。你能推薦任何信息來學習ELF文件格式嗎? – bluesea

+0

添加了一個應該有幫助的鏈接。 –

相關問題