How to lookup all exported symbosl using reflect and unsafe

David Gamba, @gambaeng
version 0.1, 2023-04-08 #golang

How to lookup all exported symbosl using reflect and unsafe: https://github.com/golang/go/issues/17823

// https://github.com/golang/go/issues/17823
type Plug struct {
	pluginpath string
	err        string        // set if plugin failed to load
	loaded     chan struct{} // closed when loaded
	syms       map[string]any
}

func inspectPlugin(p *plugin.Plugin) {
	pl := (*Plug)(unsafe.Pointer(p))

	Logger.Printf("Plugin %s exported symbols (%d): \n", pl.pluginpath, len(pl.syms))

	for name, pointers := range pl.syms {
		Logger.Printf("symbol: %s, pointer: %v, type: %v\n", name, pointers, reflect.TypeOf(pointers))
		if _, ok := pointers.(func(*getoptions.GetOpt) getoptions.CommandFn); ok {
			fmt.Printf("name: %s\n", name)
		}
	}
}