diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmd/link/internal/ld/data.go | 13 | ||||
| -rw-r--r-- | src/cmd/link/internal/ld/link.go | 1 | ||||
| -rw-r--r-- | src/cmd/link/internal/ld/symtab.go | 2 | ||||
| -rw-r--r-- | src/runtime/iface.go | 3 | ||||
| -rw-r--r-- | src/runtime/symtab.go | 2 |
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 |
