最近我嘗試在自己的linux平臺上編寫一個簡單的編譯器。在不使用libelf或其他庫的情況下創建ELF二進制文件
當談到編譯器的後端時,我決定不使用第三方庫(如libelf
)生成ELF格式的二進制文件。
相反,我想嘗試直接將機器代碼寫入到ELF ABI文件中,只需使用write()
函數並控制ELF文件的所有細節。
這種方法的優點是我可以控制我的編譯器的一切。
但我很猶豫。考慮到ELF ABI的詳細程度,這種方式是否可行?
我希望有任何建議和指向可用的良好可用資源。
最近我嘗試在自己的linux平臺上編寫一個簡單的編譯器。在不使用libelf或其他庫的情況下創建ELF二進制文件
當談到編譯器的後端時,我決定不使用第三方庫(如libelf
)生成ELF格式的二進制文件。
相反,我想嘗試直接將機器代碼寫入到ELF ABI文件中,只需使用write()
函數並控制ELF文件的所有細節。
這種方法的優點是我可以控制我的編譯器的一切。
但我很猶豫。考慮到ELF ABI的詳細程度,這種方式是否可行?
我希望有任何建議和指向可用的良好可用資源。
這很容易/可行取決於你想支持的功能。如果你想使用動態鏈接,你必須處理符號表,重定位等。當然,如果你想能夠與現有的庫,甚至靜態鏈接,你將不得不支持他們需要的任何東西。但是如果你的目標是製作獨立的靜態ELF二進制文件,那真的很簡單。所有你需要的是一個主要的ELF頭文件(100%樣板文件)和2個PT_LOAD
程序頭文件:一個載入你程序的代碼段,另一個載入它的數據段。理論上它們可以結合使用,但是安全強化的內核不允許給定的頁面既可寫也可執行,所以將它們分開是明智的。
一些建議閱讀:
Thannks爲您的建議。你能推薦任何信息來學習ELF文件格式嗎? – bluesea
添加了一個應該有幫助的鏈接。 –
是啊,舊的「我想要寫我自己的百科全書,因爲那時候我不擔心在一個任何錯誤這就是被同行審查,成千上萬人的校對 - 我可以做得更好「的論據。 –
@Marc - 對於製作軟件,我完全同意。但是,如果您已經編寫自己的編譯器來學習編譯器編寫,那麼爲什麼不能一路走下去,自己做代碼生成和輸出。可能是一個非常有趣的學習經歷。 – QuantumMechanic
這將是鏈接器的工作,而不是編譯器。 –