@@ -7,7 +7,7 @@ package runtime
7
7
import "unsafe"
8
8
9
9
//go:linkname plugin_lastmoduleinit plugin.lastmoduleinit
10
- func plugin_lastmoduleinit () map [string ]interface {} {
10
+ func plugin_lastmoduleinit () ( path string , syms map [string ]interface {}) {
11
11
md := firstmoduledata .next
12
12
if md == nil {
13
13
throw ("runtime: no plugin module data" )
@@ -19,20 +19,27 @@ func plugin_lastmoduleinit() map[string]interface{} {
19
19
throw ("runtime: plugin already initialized" )
20
20
}
21
21
22
- if fmd := & firstmoduledata ; inRange (fmd .text , fmd .etext , md .text , md .etext ) ||
23
- inRange (fmd .bss , fmd .ebss , md .bss , md .ebss ) ||
24
- inRange (fmd .data , fmd .edata , md .data , md .edata ) ||
25
- inRange (fmd .types , fmd .etypes , md .types , md .etypes ) {
26
- println ("plugin: new module data overlaps with firstmoduledata" )
27
- println ("\t firstmoduledata.text-etext=" , hex (fmd .text ), "-" , hex (fmd .etext ))
28
- println ("\t firstmoduledata.bss-ebss=" , hex (fmd .bss ), "-" , hex (fmd .ebss ))
29
- println ("\t firstmoduledata.data-edata=" , hex (fmd .data ), "-" , hex (fmd .edata ))
30
- println ("\t firstmoduledata.types-etypes=" , hex (fmd .types ), "-" , hex (fmd .etypes ))
31
- println ("\t md.text-etext=" , hex (md .text ), "-" , hex (md .etext ))
32
- println ("\t md.bss-ebss=" , hex (md .bss ), "-" , hex (md .ebss ))
33
- println ("\t md.data-edata=" , hex (md .data ), "-" , hex (md .edata ))
34
- println ("\t md.types-etypes=" , hex (md .types ), "-" , hex (md .etypes ))
35
- throw ("plugin: new module data overlaps with firstmoduledata" )
22
+ for pmd := & firstmoduledata ; pmd != md ; pmd = pmd .next {
23
+ if pmd .pluginpath == md .pluginpath {
24
+ println ("plugin: plugin" , md .pluginpath , "already loaded" )
25
+ throw ("plugin: plugin already loaded" )
26
+ }
27
+
28
+ if inRange (pmd .text , pmd .etext , md .text , md .etext ) ||
29
+ inRange (pmd .bss , pmd .ebss , md .bss , md .ebss ) ||
30
+ inRange (pmd .data , pmd .edata , md .data , md .edata ) ||
31
+ inRange (pmd .types , pmd .etypes , md .types , md .etypes ) {
32
+ println ("plugin: new module data overlaps with previous moduledata" )
33
+ println ("\t pmd.text-etext=" , hex (pmd .text ), "-" , hex (pmd .etext ))
34
+ println ("\t pmd.bss-ebss=" , hex (pmd .bss ), "-" , hex (pmd .ebss ))
35
+ println ("\t pmd.data-edata=" , hex (pmd .data ), "-" , hex (pmd .edata ))
36
+ println ("\t pmd.types-etypes=" , hex (pmd .types ), "-" , hex (pmd .etypes ))
37
+ println ("\t md.text-etext=" , hex (md .text ), "-" , hex (md .etext ))
38
+ println ("\t md.bss-ebss=" , hex (md .bss ), "-" , hex (md .ebss ))
39
+ println ("\t md.data-edata=" , hex (md .data ), "-" , hex (md .edata ))
40
+ println ("\t md.types-etypes=" , hex (md .types ), "-" , hex (md .etypes ))
41
+ throw ("plugin: new module data overlaps with previous moduledata" )
42
+ }
36
43
}
37
44
38
45
// Initialize the freshly loaded module.
@@ -54,7 +61,7 @@ func plugin_lastmoduleinit() map[string]interface{} {
54
61
// Because functions are handled specially in the plugin package,
55
62
// function symbol names are prefixed here with '.' to avoid
56
63
// a dependency on the reflect package.
57
- syms : = make (map [string ]interface {}, len (md .ptab ))
64
+ syms = make (map [string ]interface {}, len (md .ptab ))
58
65
for _ , ptab := range md .ptab {
59
66
symName := resolveNameOff (unsafe .Pointer (md .types ), ptab .name )
60
67
t := (* _type )(unsafe .Pointer (md .types )).typeOff (ptab .typ )
@@ -68,7 +75,7 @@ func plugin_lastmoduleinit() map[string]interface{} {
68
75
}
69
76
syms [name ] = val
70
77
}
71
- return syms
78
+ return md . pluginpath , syms
72
79
}
73
80
74
81
// inRange reports whether v0 or v1 are in the range [r0, r1].
0 commit comments