func (p *proc) Addr() uintptr {
	return p.addr
}
Addr returns the address of the procedure represented by p.
The return value can be passed to Syscall to run the procedure.
package unix
import (
	"sync"
	"sync/atomic"
	"syscall"
	"unsafe"
)
type soError struct {
	Err     error
	ObjName string
	Msg     string
}
func (e *soError) Error() string { return e.Msg }
func rawSysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)
func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)
func dlclose(handle uintptr) (err syscall.Errno)
func dlopen(name *uint8, mode uintptr) (handle uintptr, err syscall.Errno)
func dlsym(handle uintptr, name *uint8) (proc uintptr, err syscall.Errno)
type so struct {
	Name   string
	Handle uintptr
}
func loadSO(name string) (*so, error) {
	namep, err := BytePtrFromString(name)
	if err != nil {
		return nil, err
	}
	h, e := dlopen(namep, 1)  
	if e != 0 {
		return nil, &soError{
			Err:     e,
			ObjName: name,
			Msg:     "Failed to load " + name + ": " + e.Error(),
		}
	}
	d := &so{
		Name:   name,
		Handle: uintptr(h),
	}
	return d, nil
}
func mustLoadSO(name string) *so {
	d, e := loadSO(name)
	if e != nil {
		panic(e)
	}
	return d
}
func (d *so) FindProc(name string) (*proc, error) {
	namep, err := BytePtrFromString(name)
	if err != nil {
		return nil, err
	}
	a, _ := dlsym(uintptr(d.Handle), namep)
	if a == 0 {
		return nil, &soError{
			Err:     ENOSYS,
			ObjName: name,
			Msg:     "Failed to find " + name + " procedure in " + d.Name,
		}
	}
	p := &proc{
		SO:   d,
		Name: name,
		addr: a,
	}
	return p, nil
}
func (d *so) MustFindProc(name string) *proc {
	p, e := d.FindProc(name)
	if e != nil {
		panic(e)
	}
	return p
}
func (d *so) Release() (err error) {
	return dlclose(d.Handle)
}
type proc struct {
	SO   *so
	Name string
	addr uintptr
}