diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index a4c52e942b..c3550e59a5 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -2159,9 +2159,19 @@ func (state *dodataState) dodataSect(ctxt *Link, symn sym.SymKind, syms []loader var head, tail loader.Sym ldr := ctxt.loader sl := make([]symNameSize, len(syms)) + + // For ppc64, we want to interleave the .got and .toc sections + // from input files. Both are type sym.SELFGOT, so in that case + // we skip size comparison and do the name comparison instead + // (conveniently, .got sorts before .toc). + checkSize := symn != sym.SELFGOT + for k, s := range syms { ss := ldr.SymSize(s) - sl[k] = symNameSize{name: ldr.SymName(s), sz: ss, sym: s} + sl[k] = symNameSize{sz: ss, sym: s} + if !checkSize { + sl[k].name = ldr.SymName(s) + } ds := int64(len(ldr.Data(s))) switch { case ss < ds: @@ -2187,12 +2197,6 @@ func (state *dodataState) dodataSect(ctxt *Link, symn sym.SymKind, syms []loader } } - // For ppc64, we want to interleave the .got and .toc sections - // from input files. Both are type sym.SELFGOT, so in that case - // we skip size comparison and fall through to the name - // comparison (conveniently, .got sorts before .toc). - checkSize := symn != sym.SELFGOT - // Perform the sort. if symn != sym.SPCLNTAB { sort.Slice(sl, func(i, j int) bool { @@ -2209,11 +2213,12 @@ func (state *dodataState) dodataSect(ctxt *Link, symn sym.SymKind, syms []loader if isz != jsz { return isz < jsz } - } - iname := sl[i].name - jname := sl[j].name - if iname != jname { - return iname < jname + } else { + iname := sl[i].name + jname := sl[j].name + if iname != jname { + return iname < jname + } } return si < sj })