mirror of https://github.com/golang/go.git
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:
parent
6966b67510
commit
c90f6dd496
|
|
@ -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"
|
||||
|
|
@ -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())
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Reference in New Issue