]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: permit duplicate weak symbols
authorJoel Sing <joel@sing.id.au>
Wed, 27 Mar 2019 13:53:19 +0000 (00:53 +1100)
committerIan Lance Taylor <iant@golang.org>
Fri, 29 Mar 2019 17:46:01 +0000 (17:46 +0000)
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>
misc/cgo/test/testdata/issue29563.go [new file with mode: 0644]
misc/cgo/test/testdata/issue29563/weak.go [new file with mode: 0644]
misc/cgo/test/testdata/issue29563/weak1.c [new file with mode: 0644]
misc/cgo/test/testdata/issue29563/weak2.c [new file with mode: 0644]
src/cmd/link/internal/loadelf/ldelf.go

diff --git a/misc/cgo/test/testdata/issue29563.go b/misc/cgo/test/testdata/issue29563.go
new file mode 100644 (file)
index 0000000..84def3c
--- /dev/null
@@ -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"
diff --git a/misc/cgo/test/testdata/issue29563/weak.go b/misc/cgo/test/testdata/issue29563/weak.go
new file mode 100644 (file)
index 0000000..21cf635
--- /dev/null
@@ -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())
+}
diff --git a/misc/cgo/test/testdata/issue29563/weak1.c b/misc/cgo/test/testdata/issue29563/weak1.c
new file mode 100644 (file)
index 0000000..86a2273
--- /dev/null
@@ -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;
+}
diff --git a/misc/cgo/test/testdata/issue29563/weak2.c b/misc/cgo/test/testdata/issue29563/weak2.c
new file mode 100644 (file)
index 0000000..e01eae8
--- /dev/null
@@ -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;
+}
index d85d91948a750aa3ae12a0631397d9656fe36617..916b7cf9f2d7232378ac2dbef49209f92b6dd787 100644 (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: