aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/link/internal/loader
diff options
context:
space:
mode:
authorCherry Zhang <cherryyz@google.com>2019-10-17 18:42:38 -0400
committerCherry Zhang <cherryyz@google.com>2019-10-19 15:18:32 +0000
commit5777ffd6e6f63647b4e4ab9a0dbfba670d2d5ced (patch)
treee38bf4da200d89c144c824f450b5c7493980683c /src/cmd/link/internal/loader
parentc3459eaab0f83be9515e8bc5624ad372a426a6eb (diff)
downloadgo-5777ffd6e6f63647b4e4ab9a0dbfba670d2d5ced.tar.xz
[dev.link] cmd/link: allow either of duplicated symbols being dupok
If two symbols have the same name, the old code allows either one being dupok (preferably both, but either is ok). Currently, the new code only works when the new symbol being dupok (or both). Allow only old symbol being dupok as well. One example for this is the tls_g variable on ARM64 and PPC64 when the race detector is enabled. Should fix Linux/ARM64 build. Change-Id: I8dd21c017e826847f13471c30dfd71bf225d8076 Reviewed-on: https://go-review.googlesource.com/c/go/+/201642 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Than McIntosh <thanm@google.com>
Diffstat (limited to 'src/cmd/link/internal/loader')
-rw-r--r--src/cmd/link/internal/loader/loader.go11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go
index 6ad37d6061..6f4bc98234 100644
--- a/src/cmd/link/internal/loader/loader.go
+++ b/src/cmd/link/internal/loader/loader.go
@@ -152,14 +152,17 @@ func (l *Loader) AddSym(name string, ver int, i Sym, r *oReader, dupok bool, typ
if dupok {
return false
}
+ oldr, li := l.toLocal(oldi)
+ oldsym := goobj2.Sym{}
+ oldsym.Read(oldr.Reader, oldr.SymOff(li))
+ if oldsym.Dupok() {
+ return false
+ }
overwrite := r.DataSize(int(i-l.startIndex(r))) != 0
if overwrite {
// new symbol overwrites old symbol.
- oldr, li := l.toLocal(oldi)
- oldsym := goobj2.Sym{}
- oldsym.Read(oldr.Reader, oldr.SymOff(li))
oldtyp := sym.AbiSymKindToSymKind[objabi.SymKind(oldsym.Type)]
- if !oldsym.Dupok() && !((oldtyp == sym.SDATA || oldtyp == sym.SNOPTRDATA || oldtyp == sym.SBSS || oldtyp == sym.SNOPTRBSS) && oldr.DataSize(li) == 0) { // only allow overwriting 0-sized data symbol
+ if !((oldtyp == sym.SDATA || oldtyp == sym.SNOPTRDATA || oldtyp == sym.SBSS || oldtyp == sym.SNOPTRBSS) && oldr.DataSize(li) == 0) { // only allow overwriting 0-sized data symbol
log.Fatalf("duplicated definition of symbol " + name)
}
l.overwrite[oldi] = i