goloader - golang動態加載的實現


 

github地址:https://github.com/dearplain/goloader

這里有以前的一些思路:http://www.cnblogs.com/dearplain/p/8145985.html,不過改了好多,具體還是要看代碼。

 

這個動態加載庫是很有意思的項目,它直接重用了golang編譯器的輸出,不需要自己寫編譯器,就能支持所有golang的語言特征,免費使用編譯器的優化。

因為這個庫只進行符號重定位,和提供runtime信息,所有這些邏輯是很少改動的,這樣使得這個庫兼容能力特別強,比如golang出新版本時候,只需要做很少的改動或者不改動,就能支持新版本。

同時它也重用了不少go的內部庫,特別是讀取object文件的庫,這些重用使得它變得輕量和便於維護。

 

它對比plugin的優勢,一是它是可以卸載加載的代碼,二是它復用了runtime,不像plugin那么大,三是它同時支持windows、macos、linux。

它也是唯一一個能動態加載卸載原生golang的庫。

另外,它加載的代碼是可以調試的,而且支持pprof,就是說你可以在pprof工具里面看到加載的代碼!

目前goloader支持>=1.8的go版本,支持x86/x64、arm32指令集,支持windows、linux、macos。

 

整個項目花了筆者不少時間,不過結果看起來還算滿意,它的小巧和可卸載性、和golang一樣的高性能、可調試性、可以pprof,使得它有自己的優點。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM