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,使得它有自己的優點。