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