aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cmd/link/internal/ld/data.go29
1 files changed, 17 insertions, 12 deletions
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
})