diff options
Diffstat (limited to 'src/cmd/link/internal/loader')
-rw-r--r-- | src/cmd/link/internal/loader/loader.go | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 32c342e545..3df84c5c94 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -434,7 +434,17 @@ func (l *Loader) AddSym(name string, ver int, r *oReader, li int, kind int, dupo if l.flags&FlagStrictDups != 0 { l.checkdup(name, r, li, oldi) } - return oldi, false + // Fix for issue #46656 -- given two dupok symbols with + // different sizes, favor symbol with larger size. + szdup := l.SymSize(oldi) + sz := int64(r.Sym(li).Siz()) + if szdup >= sz { + return oldi, false + } else { + // new symbol overwrites old symbol. + l.objSyms[oldi] = objSym{r, li} + return oldi, true + } } oldr, oldli := l.toLocal(oldi) oldsym := oldr.Sym(oldli) |