aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cmd/link/internal/ld/data.go13
-rw-r--r--src/cmd/link/internal/ld/link.go1
-rw-r--r--src/cmd/link/internal/ld/symtab.go2
-rw-r--r--src/runtime/iface.go3
-rw-r--r--src/runtime/symtab.go2
5 files changed, 19 insertions, 2 deletions
diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go
index bf2bac18af..773efb421f 100644
--- a/src/cmd/link/internal/ld/data.go
+++ b/src/cmd/link/internal/ld/data.go
@@ -2549,6 +2549,19 @@ func (state *dodataState) dodataSect(ctxt *Link, symn sym.SymKind, syms []loader
su.SetUint(ctxt.Arch, ctxt.moduledataItabOffset, uint64(typeSize))
}
+ itabSize := int64(0)
+ for ; i < len(sl); i++ {
+ itabSize = Rnd(itabSize, int64(symalign(ldr, sl[i].sym)))
+ itabSize += sl[i].sz
+ }
+
+ if ctxt.moduledataItabSizeOffset == 0 {
+ Errorf("internal error: phase error: moduledataItabSizeOffset not set in dodataSect")
+ } else {
+ su := ldr.MakeSymbolUpdater(ctxt.Moduledata)
+ su.SetUint(ctxt.Arch, ctxt.moduledataItabSizeOffset, uint64(itabSize))
+ }
+
default:
sort.Slice(sl, sortFn)
}
diff --git a/src/cmd/link/internal/ld/link.go b/src/cmd/link/internal/ld/link.go
index 1ab54dc918..c0d20680a7 100644
--- a/src/cmd/link/internal/ld/link.go
+++ b/src/cmd/link/internal/ld/link.go
@@ -98,6 +98,7 @@ type Link struct {
moduledataTypeDescOffset int64
moduledataItabOffset int64
+ moduledataItabSizeOffset int64
PackageFile map[string]string
PackageShlib map[string]string
diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go
index ddc2278593..37ab0fa582 100644
--- a/src/cmd/link/internal/ld/symtab.go
+++ b/src/cmd/link/internal/ld/symtab.go
@@ -638,6 +638,8 @@ func (ctxt *Link) symtab(pcln *pclntab) []sym.SymKind {
moduledata.AddAddr(ctxt.Arch, ldr.Lookup("runtime.etypes", 0))
ctxt.moduledataItabOffset = moduledata.Size()
moduledata.AddUint(ctxt.Arch, 0) // filled in by dodataSect
+ ctxt.moduledataItabSizeOffset = moduledata.Size()
+ moduledata.AddUint(ctxt.Arch, 0) // filled in by dodataSect
moduledata.AddAddr(ctxt.Arch, ldr.Lookup("runtime.rodata", 0))
moduledata.AddAddr(ctxt.Arch, ldr.Lookup("go:func.*", 0))
moduledata.AddAddr(ctxt.Arch, ldr.Lookup("runtime.epclntab", 0))
diff --git a/src/runtime/iface.go b/src/runtime/iface.go
index 5e58db6108..009f104327 100644
--- a/src/runtime/iface.go
+++ b/src/runtime/iface.go
@@ -269,7 +269,8 @@ func itabsinit() {
// This is an optimization to let us skip creating itabs we already have.
func addModuleItabs(md *moduledata) {
p := md.types + md.itaboffset
- for p < md.etypes {
+ end := p + md.itabsize
+ for p < end {
itab := (*itab)(unsafe.Pointer(p))
itabAdd(itab)
p += uintptr(itab.Size())
diff --git a/src/runtime/symtab.go b/src/runtime/symtab.go
index f5e69c26ec..aa84a6f94e 100644
--- a/src/runtime/symtab.go
+++ b/src/runtime/symtab.go
@@ -420,7 +420,7 @@ type moduledata struct {
covctrs, ecovctrs uintptr
end, gcdata, gcbss uintptr
types, typedesclen, etypes uintptr
- itaboffset uintptr
+ itaboffset, itabsize uintptr
rodata uintptr
gofunc uintptr // go.func.*
epclntab uintptr