cmd/link: permit duplicate weak symbols

Permit weak symbols to be duplicates - most external linkers allow
this and there are various situations where they can occur (including
retpoline and retguard).

Fixes #29563

Change-Id: I355493c847fbc8f670a85a643db65a4cf8f9883d
Reviewed-on: https://go-review.googlesource.com/c/go/+/169658
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
Joel Sing 2019-03-28 00:53:19 +11:00 committed by Ian Lance Taylor
parent 6966b67510
commit c90f6dd496
5 changed files with 52 additions and 0 deletions

12
misc/cgo/test/testdata/issue29563.go vendored Normal file
View File

@ -0,0 +1,12 @@
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build !windows
// Issue 29563: internal linker fails on duplicate weak symbols.
// No runtime test; just make sure it compiles.
package cgotest
import _ "cgotest/issue29563"

View File

@ -0,0 +1,13 @@
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package issue29563
//int foo1();
//int foo2();
import "C"
func Bar() int {
return int(C.foo1()) + int(C.foo2())
}

View File

@ -0,0 +1,11 @@
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
extern int weaksym __attribute__((__weak__));
int weaksym = 42;
int foo1()
{
return weaksym;
}

View File

@ -0,0 +1,11 @@
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
extern int weaksym __attribute__((__weak__));
int weaksym = 42;
int foo2()
{
return weaksym;
}

View File

@ -1088,6 +1088,11 @@ func readelfsym(arch *sys.Arch, syms *sym.Symbols, elfobj *ElfObj, i int, elfsym
if elfsym.other == 2 {
s.Attr |= sym.AttrVisibilityHidden
}
// Allow weak symbols to be duplicated when already defined.
if s.Outer != nil {
s.Attr |= sym.AttrDuplicateOK
}
}
default: