package runtime
import
func () ( string, map[string]interface{}, string) {
var *moduledata
for := firstmoduledata.next; != nil; = .next {
if .bad {
= nil
continue
}
=
}
if == nil {
throw("runtime: no plugin module data")
}
if .pluginpath == "" {
throw("runtime: plugin has empty pluginpath")
}
if .typemap != nil {
return "", nil, "plugin already loaded"
}
for , := range activeModules() {
if .pluginpath == .pluginpath {
.bad = true
return "", nil, "plugin already loaded"
}
if inRange(.text, .etext, .text, .etext) ||
inRange(.bss, .ebss, .bss, .ebss) ||
inRange(.data, .edata, .data, .edata) ||
inRange(.types, .etypes, .types, .etypes) {
println("plugin: new module data overlaps with previous moduledata")
println("\tpmd.text-etext=", hex(.text), "-", hex(.etext))
println("\tpmd.bss-ebss=", hex(.bss), "-", hex(.ebss))
println("\tpmd.data-edata=", hex(.data), "-", hex(.edata))
println("\tpmd.types-etypes=", hex(.types), "-", hex(.etypes))
println("\tmd.text-etext=", hex(.text), "-", hex(.etext))
println("\tmd.bss-ebss=", hex(.bss), "-", hex(.ebss))
println("\tmd.data-edata=", hex(.data), "-", hex(.edata))
println("\tmd.types-etypes=", hex(.types), "-", hex(.etypes))
throw("plugin: new module data overlaps with previous moduledata")
}
}
for , := range .pkghashes {
if .linktimehash != *.runtimehash {
.bad = true
return "", nil, "plugin was built with a different version of package " + .modulename
}
}
modulesinit()
typelinksinit()
pluginftabverify()
moduledataverify1()
lock(&itabLock)
for , := range .itablinks {
itabAdd()
}
unlock(&itabLock)
= make(map[string]interface{}, len(.ptab))
for , := range .ptab {
:= resolveNameOff(unsafe.Pointer(.types), .name)
:= (*_type)(unsafe.Pointer(.types)).typeOff(.typ)
var interface{}
:= (*[2]unsafe.Pointer)(unsafe.Pointer(&))
(*)[0] = unsafe.Pointer()
:= .name()
if .kind&kindMask == kindFunc {
= "." +
}
[] =
}
return .pluginpath, , ""
}
func ( *moduledata) {
:= false
for := 0; < len(.ftab); ++ {
:= .ftab[].entry
if .minpc <= && <= .maxpc {
continue
}
:= funcInfo{(*_func)(unsafe.Pointer(&.pclntable[.ftab[].funcoff])), }
:= funcname()
:= "none"
:= uintptr(0)
:= findfunc()
if .valid() {
= funcname()
= .entry
}
= true
println("ftab entry outside pc range: ", hex(), "/", hex(), ": ", , "/", )
}
if {
throw("runtime: plugin has bad symbol table")
}
}
func (, , , uintptr) bool {
return ( >= && <= ) || ( >= && <= )
}
type ptabEntry struct {
name nameOff
typ typeOff
}