Commit c90f6dd4 authored by Joel Sing's avatar Joel Sing Committed by Ian Lance Taylor

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: default avatarIan Lance Taylor <iant@golang.org>
parent 6966b675
// 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"
// 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())
}
// 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;
}
// 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 ...@@ -1088,6 +1088,11 @@ func readelfsym(arch *sys.Arch, syms *sym.Symbols, elfobj *ElfObj, i int, elfsym
if elfsym.other == 2 { if elfsym.other == 2 {
s.Attr |= sym.AttrVisibilityHidden s.Attr |= sym.AttrVisibilityHidden
} }
// Allow weak symbols to be duplicated when already defined.
if s.Outer != nil {
s.Attr |= sym.AttrDuplicateOK
}
} }
default: default:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment